Modul: todoist - Task-/Listenverwaltung in FHEM (Bsp. Einkaufsliste) + Frontend

Begonnen von marvin78, 27 Oktober 2017, 16:26:48

Vorheriges Thema - Nächstes Thema

crispyduck

Eigenes Modul will und kann ich wohl auch nicht daraus basteln.

Kann wie gesagt nicht wirklich Programmieren und Perl kenne ich seit dem ich mich mit FHEM beschäftige. Man lernt aber auch sehr viel wenn man sich mit dem code von jemanden anderes beschäftigt und verstehen will wie was funktioniert. Bei dir ist alles sehr strukturiert, und gut Kommentiert, das macht es etwas einfacher.
Wie man einen pull request macht muss ich mir erst ansehen. Sollte vielleicht auch einmal einen Git account erstellen.  ;)

Ja, die parent_id macht auch sinn, habe ich vielleicht etwas blöd geschrieben, aber hätte die jetzt auch nicht ganz weg gelassen, sondern in der for Schleife über order und indent gesetzt und nicht durch den Api response. Somit war das heute morgen auch nur eine kleine Änderung in der for schleife "walk through projects".

Ich hab das jetzt auch nochmal versucht nachzustellen, und wie es scheint wird beim anlegen, verschieben,... die parent id immer richtig gesetzt.
Darauf dann nochmal die Android App gestartet, und gleich beim hinzufügen des ersten Projektes welchem ein anderes als Hauptaufgabe zugewiesen hat fehlt im Api response die parent_id (undef).

Beim weiter herum spielen ist mir auch noch aufgefallen das wenn ich in der Android App ein Haupt Projekt, also ohne indent anlege es korrekt die parent_id null bekommt; verschiebe ich dieses aber so das es indent 2 oder höher bekommt, bleibt die parent_id null.

Ändert man danach z.B. einfach nur die order in der Webapp passt wieder alles.

Scheint also ein Bug in der Android App zu sein, bzw. eigentlich auch in todoist allgemein. Wenn die parent_id mandatory ist, sollte todoist keine client eingabe ohne akzeptieren, wenn sie es nicht ist, sollte sie zumindest vom system generiert werden.
Ist doch auch seltsam das die Api zulässt zweimal die selbe order und indent zu vergeben?!

Kann man dann wohl wirklich nur hoffen das todoist da was ändert.  :-[

Lg,
crispyduck

marvin78

Ich nehme an, die App nutzt die eigene API  8)

Der Support ist nett und sie nehmen Vorschläge gut auf. Du solltest das Problem im Detail melden.

crispyduck

Habe ich eben gemacht.  ;)

Bis da eventuell was gefixt ist, muss man wenn es neue Projekte gibt diese eben über web anlegen.

Frage noch zur Sprache, könnte man die auch woanders setzen? Ich hätte mein FHEM gerne weiterhin auf english und nur das Frontend für das Tablet auf deutsch.

Und noch eine Frage, was nicht direkt was mit dem Thema zu tun hat. Ich verwende folgendes cmdalias um cChildProjects aufzurufen und die devices aktiv zu schalten:
defmod c_reload_todoist_projects cmdalias reload_todoist_projects .* AS set $EVENT cChildProjects;;sleep 3;;set $EVENT.*:FILTER=state!=active active;;save

Rufe ich dann über einen Button mit "reload_todoist_projects Einkauf" oder "reload_todoist_projects ToDo" auf und es funktioniert auch bestens.
Zum aktiv schalten wollte ich aber ursprünglich auf Einkauf_ oder ToDo_ filtern und wollte das so anlegen: $EVENT._.* was aber nicht funktioniert hat. Geht das, und wenn ja, wie ist die korrekte Schreibweise?

Danke,
crispyduck

marvin78

Nein. Die Sprache wird in global gesetzt. Ich könnte im Modul noch ein eigenes language Attribut unterbringen, welches, wenn gesetzt, die global Einstellung überschreibt. Ich sehe aber den Sinn noch nicht. In FHEM ändert sich durch global language DE nur in sehr wenigen Modulen etwas. Es gibt nicht viele Module, die das Attribut überhaupt nutzen. Es hat zwar auch Auswirkungen auf die Sprache, die in der lokalen commandref verwendet wird, das kann man aber durch eigene menuEntries einfach lösen. Der Rest bleibt in englisch, auch wenn man DE setzt.

Der erste Punkt ist zuviel. Ein . ersetzt in einer Regex genau ein beliebiges Zeichen. Wenn du also einen . vor das _ setzt, wird dort auch ein Zeichen erwartet. Dein Regex müsste also $EVENT_.* lauten.

crispyduck

Ja, mir geht es eigentlich um die lokale commandref, speziell eigentlich um die Device specific help bei device details. Nutze die eigentlich recht oft um einfach schnell mal nachzusehen wie ein Attribut,... richtig zu nutzen ist. Mit global DE ist dies natürlich deutsch, was bei vielen Modulen unvollständig oder überhaupt nicht vorhanden ist.

Ja, ohne Punkt hatte ich es natürlich auch als erstes versucht da die korrekte Regex ja .* ist, aber dann erwartet sich FHEM eine Variable "EVENT_". da z.B. $EVENT._Obi funktioniert hab ich es unter anderem mit dem Punkt als verbindung probiert. Das auch noch mit anfürungszeichen,... aber hab es nicht hin bekommen.




marvin78

Du hast recht. Du müsstest zu Perl wechseln. GGf. in eine eigene sub auslagern. Oder

defmod c_reload_todoist_projects cmdalias reload_todoist_projects .* AS {fhem("set $EVENT cChildProjects;sleep 3;set ".$EVENT."_.*:FILTER=state!=active active;save")}

Ungetestet.

In der neuen Version im git gibt es ein lokales language Atribut, welches, wenn gesetzt das globale überschreibt.

crispyduck

Danke!

Ja klar in Perl geht es ohne probleme; geht aber auch in FHEM, ein \ gehörte als escape vor den underscore.  ;D

Habe mir jetzt 3 cmdalias gemacht, eines zum aktualisieren der Tasks, eines um das Attribut alias zu setzen und eines um die Projekte anzulegen.

get_todoist_tasks
defmod c_get_todoist_tasks cmdalias get_todoist_tasks .* AS set $EVENT\_.* getTasks

setalias
defmod c_setalias cmdalias setalias .* AS { for my $name (devspec2array("$EVENT\_.*:FILTER=alias=")){my $alias = $name;; $alias =~ s/$EVENT\_//;; fhem("attr $name alias $alias")} }

attr c_setalias comment Sets alias of all $EVENT\_.* named devices which dont have a attr alias to devicename =~ s/$EVENT\_//\
e.g. command "setalias Einkauf" sets the attr alias of the device "Einkauf_Obi" to "Obi"


reload_todoist_projects
defmod c_reload_todoist_projects cmdalias reload_todoist_projects .* AS trigger WEBtablet JS:FW_okDialog('Todoist Projekte werden aktualisiert! Bitte warten...');;set $EVENT cChildProjects;;sleep 3;;set $EVENT\_.*:FILTER=state!=active active;;setalias $EVENT;;save;;trigger WEBtablet JS:location.reload()

attr c_reload_todoist_projects comment Loads all todoist child projects of the device $EVENT, sets them active, the alisa name and saves the config.


bei letzterem sollte man wohl noch statt "trigger WEBtablet JS:" FW_directNotify verwenden, allerdings weiß ich dann nicht wie man das in einem cmdalias mit dem fhem sleep unter bringt.

Fürs Erste funktioniert das mal recht gut. Einkauf ist in einem eigenem room, welcher bei Aufruf "get_todoist_tasks Einkauf" aufruft, in diesem gibt es neben einem Zurück button auch noch einen button um "reload_todoist_projects Einkauf" aufzurufen.


mahowi

Ich habe vorher schon das Wunderlist-Modul eingesetzt und finde auch das hier super.  :)

Einen kleinen Kritikpunkt habe ich noch. Könntest Du die deutsche Commandref nicht einfach löschen? Ich habe in global language auf DE gesetzt. So wird einem dann aber nur angezeigt, daß man sich die englische Version ansehen soll, ohne Verlinkung. Wenn keine deutsche Version vorhanden ist, wird einem über help todoist oder "Device specific help" direkt die englische Commandref angezeigt. Ich persönlich fände das wesentlich praktischer als der Verweis auf die englische Version.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

marvin78

Ich bin da leidenschaftslos. Die deutsche Version ist für diejenigen, die nicht help verwenden, sondern die komplette Commandref. Da ich nicht plane, die deutsche Commandref nachzuziehen, wenn es nicht jemand für mich macht und pflegt, kann sie auch raus. Ich bemühe mich, daran zu denke, das für die nächste Version zu machen.

crispyduck

Hallo,

habe jetzt eine Antwort von Todoist bezüglich parent_id erhalten:

ZitatHere's the reply from our dev:
There's no official parent_id attribute for projects (ref: https://developer.todoist.com/sync/v7/#add-a-project).
There could be one when "Real hierarchies" are implemented, but for now we rely on the <indent, item_order> attribute pair to get the correct hierarchical order of a project (and task, for the matter).
I'm unsure if the web app sets/sends a parent_id attribute (but I don't think it should).

Die Android Entwickler/todoist setzen anscheinend wirklich nur auf indent und item_order. Dürfte dort damit ja auch funktionieren.
Du meintest das dies nicht zuverlässig ist, weshalb? Was passiert wenn man zwei Tasks die selbe order und indent gibt?

lg,
crispyduck

marvin78

Probier es aus ;) Du kannst mit dem Modul hier indent und order explizit setzen. Allerdings natürlich nur für Tasks. Für Projekte habe ich das nicht probiert.

Edit: Ach und sie senden die parent_id über die API. Sie ist nur nicht dokumentiert. Wie anders könnte ich sie auslesen?

marvin78

Kein Edit, da echte Zusatzinfo: Sie nutzen in der Web-App selbst die API in der Version 7.1 (diese ist nicht dokumentiert aber wohl im Einsatz). Sie nutzen als Kommando nur das (auch empfohlene) project_update_orders_indents, welches bis zu einer Anfrage von mir gar nicht dokumentiert war. Beim Auslesen aber bekommen sie auch in Version 7 die parent_id zurück und nutzen diese auch für die Darstellung, wenn ich das richtig sehe.

crispyduck

Okay, danke und gut zu wissen.

Aus der Antwort lese ich zumindest auch raus das geplant ist das zu implementieren. (There could be one when "Real hierarchies" are implemented)

Bis dahin werde ich mir wohl doch noch einen Workaround einbauen um die parent_id per indent und order zu bestimmen.

crispyduck

@mahowi:

Die deutsche commandref fehlt bei sehr vielen Modulen, daher kam auch mein Wunsc die Sprache nicht per global language zu setzen.

marvin78 hat das auch gleich als lokales language Attribut implementiert, somit kann FHEM einfach auf english bleiben und die Sprache setzt du einfach per attribut.

Lg,
crispyduck