vault backup: 2025-11-22 08:14:07
This commit is contained in:
11
Personal/Areas/Cooking/Tempeh.md
Normal file
11
Personal/Areas/Cooking/Tempeh.md
Normal file
@@ -0,0 +1,11 @@
|
||||
Three ways to try marinading tempeh.
|
||||
|
||||
Smoky “Bacon” Marinade
|
||||
Whisk together 1 Tbsp avocado (or neutral) oil, 3 Tbsp tamari, 2½ Tbsp maple syrup, 1½ tsp liquid smoke, 1½ tsp smoked paprika, a pinch of sea salt, ½ tsp black pepper, and a dash of cayenne (optional). Place thinly sliced tempeh in a shallow dish, pour the marinade over, and let rest for 10–15 minutes so the strips absorb the smoky, sweet, and savory notes .
|
||||
|
||||
Sambal‐Style Marinade
|
||||
In a measuring cup, stir 3 Tbsp sweet soy sauce (kecap manis) with 1 Tbsp palm (or brown) sugar, 1 tsp tamarind concentrate (or 2½ tsp tamarind paste), and ¾ cup water until the sugar dissolves. Pour over bite-sized tempeh pieces and let marinate 15 minutes to develop that tangy-sweet sambal flavor before frying or sautéing .
|
||||
|
||||
Taco “Meat” Marinade
|
||||
Crumble an 8 oz block of tempeh by hand into small bits, then toss with 2 Tbsp low-sodium tamari, 2 Tbsp fresh lime juice, and 1 Tbsp taco seasoning (plus 1 tsp extra if you like it spicier). Let sit for at least 5 minutes (up to 15) so the tempeh soaks up the tangy, umami-packed seasoning before cooking .
|
||||
|
||||
Binary file not shown.
Binary file not shown.
7
Personal/Areas/Cooking/Yerba mate/Yerba mate.md
Normal file
7
Personal/Areas/Cooking/Yerba mate/Yerba mate.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
created: 2025-06-28 16:05
|
||||
updated: 2025-06-28 16:05
|
||||
---
|
||||
Don't like the smoked varieties.
|
||||
Don't like the lemon varieties, they are to chemical.
|
||||
Favourit as of Juni 2025 the Yerba Mate Mas INtelligent
|
||||
4
Personal/Areas/Health/Knee.md
Normal file
4
Personal/Areas/Health/Knee.md
Normal file
@@ -0,0 +1,4 @@
|
||||
On the first of May, I fell while climbing over something and slipping, landing with my full weight just below my knee. Initially, it was painful but not more than you would expect, considering the circumstances. The swelling was less than I expected. I even finished my run and when on a run on the 5th.
|
||||
However, the pain didn't disappear, so I stopped running and playing padel. I did continue with my strength training, although at a much lower weight when training my legs. On the 23rd of June (after about 7 weeks), I asked my doctor about it, and he told me to rest and take a non-steroidal anti-inflammatory drug for at least the next two weeks.
|
||||
|
||||
After two weeks, everything was indeed fine - the doctor was right.
|
||||
1
Personal/Areas/MCP-Servers/mcp-wolframalpha
Submodule
1
Personal/Areas/MCP-Servers/mcp-wolframalpha
Submodule
Submodule Personal/Areas/MCP-Servers/mcp-wolframalpha added at 3306f22da9
Binary file not shown.
Binary file not shown.
7
Personal/Areas/Mental Health/Burnout/Burnout.md
Normal file
7
Personal/Areas/Mental Health/Burnout/Burnout.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
created: 2025-07-18 16:21
|
||||
updated: 2025-07-18 16:22
|
||||
tags:
|
||||
- RandomInterests
|
||||
---
|
||||
hi
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,83 @@
|
||||
---
|
||||
created: 2025-07-04 08:32
|
||||
updated: 2025-09-26 14:27
|
||||
---
|
||||
Cognitive Behavioral Therapy has undergone revolutionary transformation from 2004-2024, evolving from a structured, Western-centric intervention to a sophisticated, globally-adapted treatment approach validated by over 1,000 randomized controlled trials and neuroimaging evidence showing measurable brain changes. The therapy now reaches millions through digital platforms, demonstrates effectiveness across previously excluded populations, and has spawned successful third-wave variants that address earlier limitations. This comprehensive analysis reveals both **remarkable advances in CBT's scientific foundation and delivery methods**, alongside persistent challenges including a 27% non-responder rate and ongoing debates about its theoretical assumptions.
|
||||
## The neuroscience revolution validates CBT's biological mechanisms
|
||||
Two decades of brain imaging research have revealed that CBT creates systematic, measurable changes in brain structure and function, providing biological validation for psychological interventions. Meta-analyses of neuroimaging studies demonstrate that **CBT consistently reduces amygdala hyperactivity while strengthening prefrontal cortex control regions**, with these neural changes directly correlating with symptom improvement. The therapy normalizes disrupted default mode network activity associated with rumination and self-referential processing, while structural neuroplasticity studies show gray matter changes detectable within 9-11 weeks of treatment. Most remarkably, pre-treatment brain scans can now predict CBT response with **64-90% accuracy using machine learning algorithms**, suggesting future possibilities for precision medicine approaches. These findings reveal that CBT works by enhancing top-down emotional regulation through strengthened prefrontal-amygdala connectivity, providing an objective neurobiological foundation that distinguishes it from placebo effects.
|
||||
|
||||
|
||||
|
||||
## Third-wave therapies mature from innovation to mainstream practice
|
||||
|
||||
|
||||
|
||||
The period witnessed extraordinary growth of third-wave CBT approaches, with Acceptance and Commitment Therapy alone accumulating **over 1,000 randomized controlled trials by 2024**, establishing it among the most researched psychotherapies globally. Dialectical Behavior Therapy expanded far beyond borderline personality disorder to treat eating disorders, substance use, and emotional dysregulation across age groups, while Mindfulness-Based Cognitive Therapy became recommended treatment for depression relapse prevention with **30-40% reduction in relapse risk**. New approaches like Compassion-Focused Therapy emerged with sophisticated evolutionary frameworks targeting shame and self-criticism, showing large effect sizes for self-compassion improvements. These third-wave therapies successfully addressed earlier CBT limitations by incorporating mindfulness, acceptance, and values-based interventions, with 45% of ACT research now originating from low- and middle-income countries demonstrating global adoption. The establishment of certification programs, professional organizations like the Association for Contextual Behavioral Science with 9,000 members globally, and integration into healthcare systems marks the maturation of these approaches from experimental to evidence-based mainstream treatments.
|
||||
|
||||
|
||||
|
||||
## Technology transforms accessibility while maintaining clinical effectiveness
|
||||
|
||||
|
||||
|
||||
Digital innovation fundamentally altered CBT delivery, with meta-analyses of 154 randomized controlled trials showing internet-delivered CBT maintains effectiveness beyond one year with effect sizes comparable to face-to-face therapy. Major platforms like **BetterHelp's network of 35,000+ therapists** and evidence-based apps reaching over 70 million users globally democratized access to CBT. Virtual reality exposure therapy achieved non-inferiority to traditional exposure with the advantage of creating controlled environments for "overexposure" training. The emergence of AI-powered chatbots marked a breakthrough, with Dartmouth's 2024 Therabot study showing **51% average reduction in depression symptoms** and users reporting trust levels comparable to human therapists. Most significantly, the FDA's approval of prescription digital therapeutics like Rejoyn for major depression and DaylightRx for anxiety, with Medicare coverage beginning January 2025, legitimizes digital CBT as medical treatment. However, the digital divide persists with 13.1% of rural households lacking broadband, and concerns about engagement and retention remain challenges for fully self-guided interventions.
|
||||
|
||||
|
||||
|
||||
## Cultural adaptations prove essential for global effectiveness
|
||||
|
||||
|
||||
|
||||
Research definitively established that culturally adapted CBT shows superior outcomes to standard protocols, with the Triple-A Framework (Awareness, Assessment, Adjustment) providing systematic adaptation methodology across philosophical, practical, and technical domains. Successful adaptations integrated religious and spiritual elements, with Islamic adaptations incorporating Sufism as mindfulness equivalent and Indigenous approaches using "Two-Eyed Seeing" frameworks combining traditional and Western knowledge. CBT for psychosis studies in Pakistan, China, and the Middle East demonstrated **20-40% reduction in symptom distress** when culturally adapted. The expansion to previously underserved populations proved remarkably successful, with geriatric CBT showing **80% reliable improvement rates** in UK services, autism spectrum adaptations achieving 51% anxiety remission rates, and chronic pain applications demonstrating moderate to large effect sizes. These developments transformed CBT from a Western-centric approach to a globally applicable intervention respecting diverse worldviews and healing traditions.
|
||||
|
||||
|
||||
|
||||
## Meta-analytic evidence confirms robust effectiveness across conditions
|
||||
|
||||
|
||||
|
||||
The most comprehensive meta-analysis to date, examining 494 systematic reviews representing 221,128 participants across 27 conditions, found consistent effectiveness with standardized mean differences of 0.23-0.30 for quality of life, anxiety, and pain outcomes. Depression-specific analyses of 409 trials with 52,702 patients revealed CBT equals antidepressants short-term but provides **superior long-term outcomes** with relapse rates of 30.8% versus 76.2% for medication withdrawal. For anxiety disorders, placebo-controlled effect sizes ranged from 0.56 overall to 1.31 for acute stress disorder, with benefits maintained at 12-month follow-up. Cost-effectiveness analyses demonstrated that despite higher initial costs, CBT produces 20 additional quality-adjusted life-days over 5 years compared to medications, with a **73-77% probability of being cost-effective** at standard thresholds. These findings, robust even after adjusting for publication bias, establish CBT as both clinically effective and economically advantageous for long-term mental healthcare.
|
||||
|
||||
|
||||
|
||||
## Theoretical advances shift focus from content to process
|
||||
|
||||
|
||||
|
||||
The field experienced fundamental theoretical evolution, with psychological flexibility emerging as the central mechanism underlying effective therapy rather than specific cognitive content changes. Beck's Generic Cognitive Model updates incorporated dual information processing and recovery-oriented approaches focusing on aspirations beyond symptom reduction. The Unified Protocol for Transdiagnostic Treatment demonstrated that **targeting common underlying processes across disorders equals or exceeds disorder-specific protocols** while reducing therapist training burden. Metacognitive Therapy's focus on thinking processes rather than thought content showed 74% recovery rates for depression versus 52% for traditional CBT in comparative trials. Component analyses revealing behavioral activation alone equals full CBT packages challenged assumptions about cognitive specificity, suggesting mechanisms of change may be more about common factors than specific techniques. This shift toward process-based therapy represents movement from mechanistic protocols to flexible, personalized interventions based on individual psychological processes.
|
||||
|
||||
|
||||
|
||||
## Integration with other approaches addresses earlier limitations
|
||||
|
||||
|
||||
|
||||
Successful integration with psychodynamic therapy, EMDR, and somatic approaches created more comprehensive treatments, with studies showing integrated approaches achieving **89% remission for generalized anxiety** versus 53% for CBT alone. Combined CBT-medication treatments proved most beneficial for severe cases, though sequential combinations showed comparable outcomes regardless of order. The emergence of unified protocols and transdiagnostic approaches reduced the need for multiple disorder-specific trainings while maintaining effectiveness. Somatic CBT integration addressed criticisms about neglecting body-mind connections, proving particularly effective for trauma where traditional CBT reached limitations. These integrative developments represent mature evolution beyond rigid adherence to pure CBT models, acknowledging that different therapeutic elements serve different functions in healing.
|
||||
|
||||
|
||||
|
||||
## Critical perspectives reveal persistent limitations and debates
|
||||
|
||||
|
||||
|
||||
Despite advances, approximately **27% of patients remain non-responders** to CBT, with higher rates for complex trauma and personality disorders. Meta-meta-analyses revealed moderate allegiance effects where researchers' preferred treatments consistently outperform comparisons, raising objectivity questions about effectiveness claims. Cultural critiques highlight that CBT's Western individualistic assumptions conflict with collectivistic values, requiring systematic adaptation rather than simple translation. Relapse rates of 31.6% for CBT versus 41.3% for controls, while favorable, indicate substantial room for improvement. Professional debates increasingly question CBT's "gold standard" status, with social media analyses showing negative content about CBT receiving more engagement than positive content. Theoretical concerns persist about whether CBT's emphasis on "faulty thinking" pathologizes normal cognitive patterns and whether mechanisms of change involve specific techniques or common therapeutic factors.
|
||||
|
||||
|
||||
|
||||
## Implementation challenges persist despite proven effectiveness
|
||||
|
||||
|
||||
|
||||
Real-world implementation faces significant barriers including therapist shortages, with community mental health settings particularly underserved in CBT-trained professionals. Training costs and time requirements limit scalability, while maintaining treatment fidelity outside research settings proves challenging. The complexity of cases in community settings often exceeds manualized CBT protocols' scope, requiring flexible adaptation. Access barriers disproportionately affect low-income populations, with transportation, childcare, and financial constraints limiting treatment engagement. Digital solutions partially address these challenges but introduce new barriers through the digital divide and technology literacy requirements.
|
||||
|
||||
|
||||
|
||||
## Conclusion
|
||||
|
||||
|
||||
|
||||
The transformation of CBT from 2004-2024 represents remarkable scientific and clinical progress, with neurobiological validation, technological innovation, and cultural adaptation expanding its reach and effectiveness globally. The development of third-wave therapies, transdiagnostic protocols, and integrated approaches successfully addressed many early limitations while maintaining robust empirical support. **Meta-analytic evidence from over 1,000 studies confirms CBT's effectiveness across conditions**, with particular strength in preventing relapse and providing lasting benefits beyond treatment completion.
|
||||
|
||||
|
||||
|
||||
However, this maturation also brought recognition of CBT's boundaries. The therapy is not universally effective, with significant non-response rates and cultural considerations requiring careful attention. Debates about mechanisms of change and allegiance effects in research suggest need for continued theoretical refinement and methodological rigor. The future trajectory points toward personalized medicine approaches using neurobiological markers, continued technology integration, and flexible process-based interventions adapted to individual and cultural needs. These two decades have transformed CBT from a relatively rigid, symptom-focused intervention to a sophisticated, evolving family of evidence-based approaches that remain central to mental healthcare while acknowledging their place within a broader therapeutic landscape.
|
||||
@@ -0,0 +1,427 @@
|
||||
---
|
||||
created: 2025-11-11 11:00
|
||||
updated: 2025-11-11 11:00
|
||||
---
|
||||
# Daily System: Tracking & Accountability
|
||||
|
||||
## The Problem
|
||||
|
||||
You have multiple commitments:
|
||||
- Morning routine (stretch, face, bed, water)
|
||||
- Meditation (15 min daily - new)
|
||||
- Running training (3x/week - complex schedule)
|
||||
- Plus other daily goals
|
||||
|
||||
**Issue:** Plans without systems fail. You need reminders, tracking, and accountability.
|
||||
|
||||
## The Solution: Three-Layer System
|
||||
|
||||
### Layer 1: Habit Tracking App (PRIMARY SYSTEM)
|
||||
### Layer 2: Obsidian Daily Note Checklist (BACKUP/REVIEW)
|
||||
### Layer 3: Accountability Mechanisms (ENFORCEMENT)
|
||||
|
||||
---
|
||||
|
||||
## Layer 1: Habit Tracking App
|
||||
|
||||
**Recommended: Habitify** (iOS/Android, free with paid upgrade)
|
||||
|
||||
### Why Habitify for Your Needs:
|
||||
|
||||
✅ **Time tracking** - Log exact time spent (important for running workouts)
|
||||
✅ **Notes per habit** - Can note which run you did, how meditation felt
|
||||
✅ **Reminders** - Multiple per day for different habits
|
||||
✅ **Streaks** - Visual motivation
|
||||
✅ **Calendar view** - See patterns over weeks/months
|
||||
✅ **Groups** - Organize by morning/evening/training
|
||||
✅ **Free tier** - Enough for your needs
|
||||
|
||||
**Alternative if iOS-only: Streaks** ($5 one-time)
|
||||
- Simpler, more polished
|
||||
- Limited to 12 habits (enough for you)
|
||||
- Better widgets
|
||||
|
||||
### Your Habitify Setup
|
||||
|
||||
**Group 1: Morning Stack (Do in sequence)**
|
||||
1. Stretch (2-5 min)
|
||||
2. Clean face (1 min)
|
||||
3. Make bed (1 min)
|
||||
4. Drink water bottle (2 min)
|
||||
5. **Meditate - Headspace** (15 min) ← NEW
|
||||
- Reminder: 7:00 AM
|
||||
- Enable time tracking
|
||||
|
||||
**Group 2: Running (3x/week - Variable)**
|
||||
6. Track Repeats (Tue/Thu typically)
|
||||
- Note: Log which week/workout in notes
|
||||
- Time tracking enabled
|
||||
7. Tempo Run (Wed/Fri typically)
|
||||
- Note: Log workout details
|
||||
8. Long Run (Weekend)
|
||||
- Note: Log distance/time
|
||||
|
||||
**Group 3: Evening/Flexible**
|
||||
9. [Add any other daily habits here]
|
||||
- Reading?
|
||||
- Journaling?
|
||||
- Dating app check?
|
||||
|
||||
### Daily Workflow with Habitify
|
||||
|
||||
**Morning:**
|
||||
1. Wake up → See Habitify notification
|
||||
2. Open app → See today's pending habits
|
||||
3. Complete morning stack in order
|
||||
4. Check off each one as you complete it
|
||||
5. Add time/notes if relevant
|
||||
|
||||
**Running days:**
|
||||
1. Check which workout (refer to Running.md or have it in notes)
|
||||
2. Complete workout
|
||||
3. Check off in Habitify
|
||||
4. Log details in notes section
|
||||
|
||||
**Evening:**
|
||||
1. Open Habitify
|
||||
2. Review day - what's incomplete?
|
||||
3. Complete remaining habits or note why you didn't
|
||||
|
||||
---
|
||||
|
||||
## Layer 2: Obsidian Daily Note Checklist
|
||||
|
||||
**Purpose:** Backup system + review mechanism
|
||||
|
||||
### Daily Note Template
|
||||
|
||||
Create this in your daily notes (or create a template):
|
||||
|
||||
```markdown
|
||||
---
|
||||
created: {{date}}
|
||||
---
|
||||
|
||||
## Morning Stack
|
||||
- [ ] Stretch
|
||||
- [ ] Clean face
|
||||
- [ ] Make bed
|
||||
- [ ] Drink water
|
||||
- [ ] Meditate (15 min) - Headspace
|
||||
|
||||
## Training Today
|
||||
**Week:** [Current week from Running.md]
|
||||
- [ ] Track Repeats: [Details from schedule]
|
||||
- [ ] Tempo Run: [Details from schedule]
|
||||
- [ ] Long Run: [Details from schedule]
|
||||
- [ ] Rest day
|
||||
|
||||
## Evening
|
||||
- [ ] [Other habits]
|
||||
|
||||
## Notes
|
||||
- How did meditation feel?
|
||||
- Running notes:
|
||||
- Energy level today:
|
||||
```
|
||||
|
||||
**How to use:**
|
||||
- Morning: Check Obsidian, see what's planned
|
||||
- Throughout day: Check off in Habitify (main system)
|
||||
- Evening: Reconcile - update Obsidian from Habitify
|
||||
- Weekly review: Look at week's daily notes for patterns
|
||||
|
||||
---
|
||||
|
||||
## Layer 3: Accountability Mechanisms
|
||||
|
||||
Choose based on how much enforcement you need:
|
||||
|
||||
### Level 1: Visual Accountability (START HERE)
|
||||
|
||||
**Physical Calendar**
|
||||
- Print 8-week calendar
|
||||
- Hang on bathroom mirror
|
||||
- Big X for each day you complete ALL habits
|
||||
- "Don't break the chain"
|
||||
|
||||
**Habitify Widgets**
|
||||
- Add to home screen
|
||||
- See streaks without opening app
|
||||
- Seeing broken streak = motivation
|
||||
|
||||
### Level 2: Social Accountability (IF LEVEL 1 ISN'T ENOUGH)
|
||||
|
||||
**Accountability Partner**
|
||||
- Text a friend: "I'm tracking 5 daily habits. Can you check in Sundays?"
|
||||
- Every Sunday: Send them screenshot of Habitify week
|
||||
- They don't judge, just acknowledge
|
||||
- Knowing someone will see = powerful motivator
|
||||
|
||||
**Public Commitment (Nuclear option)**
|
||||
- Post weekly on social media: "Week X of daily meditation: 6/7 days"
|
||||
- Public shame is motivating for some people
|
||||
|
||||
### Level 3: Financial Accountability (NUCLEAR OPTION)
|
||||
|
||||
**Beeminder** (beeminder.com)
|
||||
- Connect goals to credit card
|
||||
- Miss meditation → Pay $5 (increases each time)
|
||||
- Miss 3+ running sessions in a week → Pay $10
|
||||
- Money goes to Beeminder (motivates you to not waste money)
|
||||
- **Very effective but stressful**
|
||||
|
||||
**stickK** (stickk.com)
|
||||
- Similar to Beeminder
|
||||
- Can donate to charity you HATE if you fail
|
||||
- Can assign referee (friend) to verify
|
||||
- Psychological pain of failing = high
|
||||
|
||||
**Only use if:**
|
||||
- You're consistently failing with Levels 1-2
|
||||
- You have disposable income to risk
|
||||
- You respond well to negative consequences
|
||||
|
||||
---
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Tonight (Setup):
|
||||
|
||||
**Step 1: Download Habitify**
|
||||
- [ ] Download from App Store/Play Store
|
||||
- [ ] Create account
|
||||
- [ ] Skip tutorial (we'll set it up properly)
|
||||
|
||||
**Step 2: Set Up Habits in Habitify**
|
||||
- [ ] Create Group: "Morning Stack"
|
||||
- Add: Stretch, Clean face, Make bed, Drink water, Meditate
|
||||
- Set all to "Daily"
|
||||
- Add reminder: 7:00 AM to "Stretch" (first one triggers the rest)
|
||||
- [ ] Create Group: "Running"
|
||||
- Add: Track Repeats (Tue/Thu), Tempo Run (Wed/Fri), Long Run (Sat/Sun)
|
||||
- Set to specific days
|
||||
- Enable time tracking + notes
|
||||
- [ ] Create Group: "Evening" (if needed)
|
||||
|
||||
**Step 3: Set Up Obsidian Template (Optional but useful)**
|
||||
- [ ] Create daily note template with checklist above
|
||||
- [ ] Or just manually add to tomorrow's note
|
||||
|
||||
**Step 4: Choose Accountability Level**
|
||||
- [ ] Level 1: Print calendar, hang it up
|
||||
- [ ] Level 2: Text accountability partner
|
||||
- [ ] Level 3: Sign up for Beeminder/stickK (only if really needed)
|
||||
|
||||
**Step 5: Add Habitify Widget to Home Screen**
|
||||
- [ ] Long press home screen
|
||||
- [ ] Add Habitify widget
|
||||
- [ ] Place prominently
|
||||
|
||||
### Tomorrow Morning (First Day):
|
||||
|
||||
1. **7:00 AM:** Habitify reminder goes off
|
||||
2. Open Habitify → See morning stack
|
||||
3. Complete each item, checking off as you go:
|
||||
- Stretch ✓
|
||||
- Clean face ✓
|
||||
- Make bed ✓
|
||||
- Drink water ✓
|
||||
- Open Headspace, do session, mark Meditate ✓
|
||||
4. Check running schedule in Running.md
|
||||
5. If running day, complete workout later, log in Habitify
|
||||
6. Evening: Review Habitify, mark X on calendar if all done
|
||||
|
||||
### Weekly Review (Every Sunday):
|
||||
|
||||
**5-10 minute check-in:**
|
||||
1. Open Habitify → Statistics tab
|
||||
2. Review each habit:
|
||||
- Morning stack: __/7 days
|
||||
- Meditation: __/7 days
|
||||
- Running: __/3 expected (did you hit all workouts?)
|
||||
3. Identify patterns:
|
||||
- What day did I skip? Why?
|
||||
- What made it easy this week?
|
||||
- What got in the way?
|
||||
4. Adjust for next week:
|
||||
- Move reminder time?
|
||||
- Add a new habit?
|
||||
- Increase difficulty?
|
||||
5. If accountability partner: Send screenshot
|
||||
6. Update calendar with weekly stats
|
||||
|
||||
---
|
||||
|
||||
## Your Complete Daily Workflow
|
||||
|
||||
### Morning (7:00 AM - 7:30 AM)
|
||||
|
||||
```
|
||||
Habitify reminder → Open app → Complete stack:
|
||||
├─ Stretch (2 min)
|
||||
├─ Clean face (1 min)
|
||||
├─ Make bed (1 min)
|
||||
├─ Drink water (2 min)
|
||||
└─ Meditate - Headspace (15 min)
|
||||
|
||||
Total: ~22 minutes
|
||||
|
||||
All checked off in Habitify ✓
|
||||
```
|
||||
|
||||
### Running Days (Variable time)
|
||||
|
||||
```
|
||||
Check Running.md for today's workout
|
||||
├─ Week X, Day Y workout
|
||||
├─ Complete workout
|
||||
├─ Log in Habitify with notes
|
||||
└─ Check off ✓
|
||||
```
|
||||
|
||||
### Evening (Before bed)
|
||||
|
||||
```
|
||||
Open Habitify
|
||||
├─ What's incomplete?
|
||||
├─ Complete remaining OR note why not
|
||||
├─ If all done → X on calendar
|
||||
└─ Quick reflection: How'd today go?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Common Issues
|
||||
|
||||
### "I forgot to check it off"
|
||||
- Set specific time-based reminders
|
||||
- Check Habitify right after completing habit, not end of day
|
||||
- Make checking off part of the habit itself
|
||||
|
||||
### "I did it but forgot to track it"
|
||||
- Habitify allows retroactive checking (back-date)
|
||||
- But this defeats the purpose - track IN THE MOMENT
|
||||
- Solution: Phone must be with you during habits
|
||||
|
||||
### "I'm traveling / sick / unusual day"
|
||||
- Habitify lets you skip days intentionally
|
||||
- Mark as "Skip" rather than leaving incomplete
|
||||
- Maintains streak psychologically
|
||||
- Prevents demotivation from broken chain
|
||||
|
||||
### "Too many habits, overwhelmed"
|
||||
- Start with just morning stack + meditation
|
||||
- Add running tracking after 2 weeks
|
||||
- Build gradually
|
||||
- 5-7 daily habits is realistic max
|
||||
|
||||
### "Not seeing progress / losing motivation"
|
||||
- Check weekly stats - focus on % completion
|
||||
- 80% is excellent (28/35 morning items per week)
|
||||
- Compare month-over-month, not day-to-day
|
||||
- Small wins compound
|
||||
|
||||
### "App is annoying / too many notifications"
|
||||
- Reduce reminders to just 1st habit of each stack
|
||||
- Turn off achievement notifications if distracting
|
||||
- Customize notification sound to something pleasant
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics (What Actually Matters)
|
||||
|
||||
**NOT:** Perfect 100% every day
|
||||
**YES:**
|
||||
|
||||
- **Morning stack: 80%+ completion** (28/35 items per week)
|
||||
- **Meditation: 6-7 days per week** (the real goal)
|
||||
- **Running: Hit planned workouts** (3/3 each week for race prep)
|
||||
- **Consistency over perfection** - 4 weeks of 80% beats 1 week of 100%
|
||||
- **Awareness** - You notice when you skip and why
|
||||
|
||||
---
|
||||
|
||||
## Recommended Stack for You
|
||||
|
||||
Based on everything:
|
||||
|
||||
**Primary System:**
|
||||
- **Habitify** (free) - Main tracking + reminders
|
||||
- **Headspace** ($70/yr) - Meditation content
|
||||
- **Running.md** (Obsidian) - Reference for workouts
|
||||
|
||||
**Accountability:**
|
||||
- **Physical calendar** - Visual daily reminder
|
||||
- **Habitify streaks** - Built-in gamification
|
||||
- **Weekly review** - Self-accountability
|
||||
|
||||
**Optional Add-ons:**
|
||||
- **Accountability partner** - If you need social pressure
|
||||
- **Obsidian daily notes** - If you want backup tracking
|
||||
- **Beeminder** - Only if consistently failing
|
||||
|
||||
---
|
||||
|
||||
## Cost Breakdown
|
||||
|
||||
**Free:**
|
||||
- Habitify (free tier sufficient)
|
||||
- Physical calendar (print yourself)
|
||||
- Accountability partner (friend)
|
||||
- Obsidian (you already use)
|
||||
|
||||
**Paid:**
|
||||
- Headspace: $70/year (~$6/month) - ALREADY COMMITTED
|
||||
- Streaks (iOS): $5 one-time (optional alternative to Habitify)
|
||||
- Beeminder: Free to start, pay when you fail (optional)
|
||||
|
||||
**Total investment:** $70/year for Headspace (already decided)
|
||||
**Everything else:** FREE
|
||||
|
||||
---
|
||||
|
||||
## Next Actions
|
||||
|
||||
**Right now (tonight):**
|
||||
|
||||
1. [ ] Download Habitify
|
||||
2. [ ] Set up 3 groups (Morning, Running, Evening)
|
||||
3. [ ] Add all habits with appropriate frequency
|
||||
4. [ ] Set 7:00 AM reminder on "Stretch"
|
||||
5. [ ] Enable time tracking on Meditate and Running habits
|
||||
6. [ ] Add Habitify widget to home screen
|
||||
7. [ ] Print 8-week calendar, hang on bathroom mirror
|
||||
8. [ ] Optional: Text accountability partner
|
||||
|
||||
**Tomorrow morning:**
|
||||
|
||||
1. [ ] 7:00 AM reminder goes off
|
||||
2. [ ] Complete morning stack
|
||||
3. [ ] Check off each item in Habitify as you go
|
||||
4. [ ] Mark X on calendar before leaving bathroom
|
||||
|
||||
**Next Sunday:**
|
||||
|
||||
1. [ ] 10 min weekly review
|
||||
2. [ ] Check Habitify stats
|
||||
3. [ ] Identify patterns and adjust
|
||||
4. [ ] Send screenshot to accountability partner if using
|
||||
|
||||
---
|
||||
|
||||
## The Bottom Line
|
||||
|
||||
You don't need a complex system. You need:
|
||||
|
||||
1. **One app** that reminds you and tracks (Habitify)
|
||||
2. **One visual** that keeps you honest (calendar)
|
||||
3. **One person** who knows what you're doing (optional accountability partner)
|
||||
4. **One review** per week to course-correct (Sunday check-in)
|
||||
|
||||
**Start simple:**
|
||||
- Habitify + Calendar + Weekly review
|
||||
- Add accountability partner if you slip
|
||||
- Add Beeminder only if you're still failing after 4 weeks
|
||||
|
||||
**Execute tonight. Review next Sunday. Adjust and continue.**
|
||||
1
Personal/Areas/Routine/Diet.md
Normal file
1
Personal/Areas/Routine/Diet.md
Normal file
@@ -0,0 +1 @@
|
||||
25-11-11, Hunger around 21
|
||||
4
Personal/Areas/Routine/Morning Routine.md
Normal file
4
Personal/Areas/Routine/Morning Routine.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- [ ] Stretch
|
||||
- [ ] Clean face
|
||||
- [ ] Make bed
|
||||
- [ ] Drink a bottle of water
|
||||
@@ -0,0 +1,482 @@
|
||||
---
|
||||
created: 2025-11-11 11:15
|
||||
updated: 2025-11-11 11:15
|
||||
---
|
||||
# Tasker Automation - Meditation Enforcement System
|
||||
|
||||
## Your Current Tools
|
||||
|
||||
- **Loop Habit Tracker** - Currently using, but ignoring notifications
|
||||
- **Simple Time Tracker** - Time tracking app
|
||||
- **Tasker** - Automation powerhouse
|
||||
|
||||
## The Problem
|
||||
|
||||
You've become immune to simple notifications. You need **automated enforcement** that escalates if you ignore it.
|
||||
|
||||
---
|
||||
|
||||
## Solution: Tasker-Based Escalating Enforcement System
|
||||
|
||||
### Concept
|
||||
|
||||
Instead of a single notification you can dismiss:
|
||||
1. **7:00 AM:** Gentle reminder
|
||||
2. **7:15 AM:** If not started → Annoying reminder
|
||||
3. **7:30 AM:** If not started → VERY annoying (locks apps, plays sound, etc.)
|
||||
4. **8:00 AM:** If not started → Nuclear option (send message to accountability partner)
|
||||
|
||||
### How It Works
|
||||
|
||||
**Trigger:** Time (7:00 AM)
|
||||
**Check:** Has "Meditation" timer started in Simple Time Tracker?
|
||||
**If NO:** Escalate reminders every 15 minutes
|
||||
**If YES:** Stop reminders, congratulate
|
||||
|
||||
---
|
||||
|
||||
## Tasker Profiles & Tasks
|
||||
|
||||
### Profile 1: Morning Meditation Check (7:00 AM)
|
||||
|
||||
**Trigger:** Time - 7:00 AM, Every day
|
||||
|
||||
**Task: "Meditation Reminder Level 1"**
|
||||
```
|
||||
A1: Variable Set
|
||||
Name: %MeditationDone
|
||||
To: 0
|
||||
|
||||
A2: Notify
|
||||
Title: Time to Meditate
|
||||
Text: Open Headspace - 15 minutes
|
||||
Icon: [Meditation icon]
|
||||
Actions: Start:Start Meditation / Snooze:Snooze
|
||||
|
||||
A3: Wait
|
||||
15 minutes
|
||||
|
||||
A4: If %MeditationDone = 0
|
||||
Perform Task: "Meditation Reminder Level 2"
|
||||
```
|
||||
|
||||
### Profile 2: Detect Meditation Started
|
||||
|
||||
**Trigger:** App → Headspace Opened
|
||||
OR
|
||||
**Trigger:** Simple Time Tracker → "Meditation" activity started
|
||||
|
||||
**Task: "Meditation Started"**
|
||||
```
|
||||
A1: Variable Set
|
||||
Name: %MeditationDone
|
||||
To: 1
|
||||
|
||||
A2: Cancel All Previous Meditation Reminders
|
||||
|
||||
A3: Notify
|
||||
Title: Great! Meditation Started
|
||||
Text: Keep going - 15 minutes
|
||||
```
|
||||
|
||||
### Profile 3: Detect Meditation Completed
|
||||
|
||||
**Trigger:** Simple Time Tracker → "Meditation" activity stopped
|
||||
AND Duration >= 10 minutes
|
||||
|
||||
**Task: "Meditation Completed"**
|
||||
```
|
||||
A1: Variable Set
|
||||
Name: %MeditationDone
|
||||
To: 2
|
||||
|
||||
A2: Notify Sound/Vibrate
|
||||
[Positive sound]
|
||||
|
||||
A3: Notify
|
||||
Title: Meditation Complete! ✓
|
||||
Text: Well done - streak continues
|
||||
|
||||
A4: HTTP Post to Beeminder (optional)
|
||||
[Log completion]
|
||||
|
||||
A5: Variable Add
|
||||
Name: %MeditationStreak
|
||||
Value: 1
|
||||
```
|
||||
|
||||
### Task: "Meditation Reminder Level 2" (7:15 AM if not started)
|
||||
|
||||
```
|
||||
A1: Play Media
|
||||
File: [Annoying sound file]
|
||||
Volume: 80%
|
||||
|
||||
A2: Notify
|
||||
Title: MEDITATION REMINDER
|
||||
Text: You're 15 minutes late. Start now!
|
||||
Priority: Max
|
||||
LED: Red
|
||||
|
||||
A3: Flash
|
||||
Text: MEDITATE NOW
|
||||
Long: On
|
||||
|
||||
A4: Wait
|
||||
15 minutes
|
||||
|
||||
A5: If %MeditationDone = 0
|
||||
Perform Task: "Meditation Reminder Level 3"
|
||||
```
|
||||
|
||||
### Task: "Meditation Reminder Level 3" (7:30 AM if not started)
|
||||
|
||||
**Nuclear escalation:**
|
||||
|
||||
```
|
||||
A1: Play Ringtone
|
||||
[Loud, annoying ringtone]
|
||||
Volume: Max
|
||||
Repeat: Until dismissed
|
||||
|
||||
A2: Notification
|
||||
Title: MEDITATION: LAST WARNING
|
||||
Text: Apps will lock in 5 minutes if you don't start
|
||||
Priority: Max
|
||||
Persistent: On
|
||||
|
||||
A3: Vibrate Pattern
|
||||
[Long vibration]
|
||||
|
||||
A4: Flash
|
||||
Text: START MEDITATION NOW
|
||||
Long: On
|
||||
|
||||
A5: Wait
|
||||
5 minutes
|
||||
|
||||
A6: If %MeditationDone = 0
|
||||
Perform Task: "Meditation Lockdown"
|
||||
```
|
||||
|
||||
### Task: "Meditation Lockdown" (7:35 AM if still not started)
|
||||
|
||||
**The nuclear option:**
|
||||
|
||||
```
|
||||
A1: App → Block All Apps
|
||||
Except: Headspace, Phone, Messages
|
||||
[Using AppBlock or Custom Overlay]
|
||||
|
||||
A2: Play Media
|
||||
File: [Very annoying alarm sound]
|
||||
Volume: Max
|
||||
Loop: Until meditation started
|
||||
|
||||
A3: Send SMS (Optional - Accountability Partner)
|
||||
To: [Friend's number]
|
||||
Message: "I haven't meditated yet today. Hold me accountable."
|
||||
|
||||
A4: AutoNotification
|
||||
Title: APPS LOCKED
|
||||
Text: Open Headspace to unlock your phone
|
||||
Persistent: On
|
||||
Can't Dismiss: On
|
||||
|
||||
A5: Create Scene
|
||||
[Full screen overlay that only dismisses when meditation starts]
|
||||
Text: "Your phone is locked until you meditate"
|
||||
Button: "Open Headspace"
|
||||
```
|
||||
|
||||
### Task: "Unlock After Meditation"
|
||||
|
||||
**Trigger:** %MeditationDone = 1 (meditation started)
|
||||
|
||||
```
|
||||
A1: Stop All Sounds
|
||||
|
||||
A2: Unblock Apps
|
||||
|
||||
A3: Destroy Scene
|
||||
|
||||
A4: Notification
|
||||
Title: Apps Unlocked
|
||||
Text: Good job starting. Finish the session!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Simple Time Tracker Integration
|
||||
|
||||
### Setup in Simple Time Tracker
|
||||
|
||||
1. Create activity: "Meditation"
|
||||
- Icon: [Meditation icon]
|
||||
- Color: Calm blue/purple
|
||||
- Goal: 15 minutes daily
|
||||
|
||||
2. Add widget to home screen
|
||||
- Quick-start meditation timer
|
||||
- One tap to begin
|
||||
|
||||
### Tasker Integration Options
|
||||
|
||||
**Option A: Detect App Launch (Simpler)**
|
||||
- Profile: App → Headspace
|
||||
- When opened → Set %MeditationDone = 1
|
||||
- When closed (>10 min later) → Set %MeditationDone = 2
|
||||
|
||||
**Option B: Detect Time Tracker Activity (More Accurate)**
|
||||
- Use AutoNotification or Tasker to detect Simple Time Tracker notifications
|
||||
- When "Meditation" activity starts → Set %MeditationDone = 1
|
||||
- When stops (>=10 min) → Set %MeditationDone = 2
|
||||
|
||||
**Option C: HTTP/Intent Integration (Most Reliable)**
|
||||
- Simple Time Tracker supports Tasker intents
|
||||
- Create intent to start "Meditation" activity
|
||||
- Tasker detects when activity is running
|
||||
|
||||
---
|
||||
|
||||
## Beeminder Integration (Optional Financial Stakes)
|
||||
|
||||
### Setup
|
||||
|
||||
1. Create Beeminder goal: "Meditate 6 days/week"
|
||||
2. Get API key from Beeminder
|
||||
3. Add to Tasker
|
||||
|
||||
### Tasker HTTP Post When Complete
|
||||
|
||||
**In "Meditation Completed" task:**
|
||||
|
||||
```
|
||||
HTTP Post
|
||||
Server: https://www.beeminder.com/api/v1/users/[USERNAME]/goals/meditation/datapoints.json
|
||||
Path:
|
||||
Data:
|
||||
auth_token=[YOUR_API_KEY]
|
||||
value=1
|
||||
comment=Completed via Tasker
|
||||
Content Type: application/json
|
||||
```
|
||||
|
||||
**Result:** Automatic logging to Beeminder when you complete meditation
|
||||
**Consequence:** Miss meditation → Beeminder charges you $5+
|
||||
|
||||
---
|
||||
|
||||
## Implementation Levels (Choose Your Enforcement)
|
||||
|
||||
### Level 1: Basic Reminders
|
||||
- 7:00 AM: Gentle notification
|
||||
- 7:15 AM: Annoying notification
|
||||
- 7:30 AM: Very annoying notification
|
||||
- **No app locking, no external accountability**
|
||||
|
||||
### Level 2: App Locking
|
||||
- All of Level 1, PLUS
|
||||
- 7:35 AM: Lock all apps except Headspace
|
||||
- Can't use phone until meditation started
|
||||
- **Forces action through restriction**
|
||||
|
||||
### Level 3: Social Accountability
|
||||
- All of Level 2, PLUS
|
||||
- 7:35 AM: Auto-send text to accountability partner
|
||||
- "I haven't meditated yet, hold me accountable"
|
||||
- **Social pressure + restriction**
|
||||
|
||||
### Level 4: Financial + Social + Locking (Nuclear)
|
||||
- All of Level 3, PLUS
|
||||
- Beeminder integration (auto-logs, charges if you miss)
|
||||
- **Maximum enforcement**
|
||||
|
||||
---
|
||||
|
||||
## Recommended Setup for You
|
||||
|
||||
Based on "I ignore all app notifications":
|
||||
|
||||
### Start with Level 2 (App Locking)
|
||||
|
||||
**Why:**
|
||||
- Level 1 won't work (you already ignore notifications)
|
||||
- Level 2 makes ignoring PAINFUL (can't use phone)
|
||||
- No external judgment (Level 3) yet
|
||||
- No money (Level 4) yet
|
||||
|
||||
**Implementation:**
|
||||
1. Set up Profiles 1-3 (reminders + escalation)
|
||||
2. Add "Meditation Lockdown" task (locks apps at 7:35 AM)
|
||||
3. Add detection for Headspace launch (unlocks apps)
|
||||
4. Test for 1 week
|
||||
|
||||
**If Level 2 still doesn't work after 1 week:**
|
||||
- Add Level 3 (text to friend)
|
||||
- Or jump to Level 4 (Beeminder)
|
||||
|
||||
---
|
||||
|
||||
## Additional Tasker Automations for Meditation
|
||||
|
||||
### Auto-Open Headspace After Water
|
||||
|
||||
**Trigger:** Simple Time Tracker → "Drink Water" activity stopped
|
||||
|
||||
**Task:**
|
||||
```
|
||||
A1: Wait 5 seconds
|
||||
|
||||
A2: Launch App
|
||||
App: Headspace
|
||||
|
||||
A3: Notify
|
||||
Title: Morning Stack Complete
|
||||
Text: Time for meditation - app opened for you
|
||||
```
|
||||
|
||||
**Why:** Removes decision fatigue, automatically opens Headspace after your water routine
|
||||
|
||||
### Evening Check-In
|
||||
|
||||
**Trigger:** Time - 9:00 PM
|
||||
|
||||
**Task:**
|
||||
```
|
||||
A1: If %MeditationDone = 2
|
||||
Say: "Great job meditating today!"
|
||||
Notify: "Meditation streak: %MeditationStreak days"
|
||||
|
||||
A2: Else
|
||||
Say: "You didn't meditate today. Better luck tomorrow."
|
||||
Variable Set: %MeditationStreak = 0
|
||||
Notify: "Streak broken. Start fresh tomorrow."
|
||||
```
|
||||
|
||||
### Weekly Stats
|
||||
|
||||
**Trigger:** Time - Sunday, 8:00 PM
|
||||
|
||||
**Task:**
|
||||
```
|
||||
A1: Calculate meditation days this week
|
||||
|
||||
A2: Send SMS to Accountability Partner
|
||||
To: [Friend]
|
||||
Message: "This week's meditation: %DaysCompleted/7 days"
|
||||
|
||||
A3: Variable Set: %WeeklyMeditationDays = 0
|
||||
[Reset counter]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Physical Setup to Support Automation
|
||||
|
||||
**Tonight:**
|
||||
1. Put phone on meditation cushion/chair to charge
|
||||
2. Put headphones next to phone
|
||||
3. Set up Simple Time Tracker "Meditation" activity
|
||||
4. Create basic Tasker profile (just 7:00 AM reminder to start)
|
||||
|
||||
**Tomorrow:**
|
||||
1. Test the basic automation
|
||||
2. If you ignore it, add Level 2 (app locking)
|
||||
3. If you still ignore it, add Level 3 (social accountability)
|
||||
|
||||
**Why this works:**
|
||||
- You're a power user (Tasker + time tracking already)
|
||||
- Leverages your existing tools
|
||||
- Escalating automation you CAN'T ignore
|
||||
- Removes manual tracking (automatic via Tasker)
|
||||
|
||||
---
|
||||
|
||||
## Tasker Profiles Summary
|
||||
|
||||
| Time | Profile | Action |
|
||||
|------|---------|--------|
|
||||
| 7:00 AM | Reminder L1 | Gentle notification |
|
||||
| 7:15 AM | Reminder L2 | Annoying notification + sound |
|
||||
| 7:30 AM | Reminder L3 | Very annoying + vibrate |
|
||||
| 7:35 AM | Lockdown | Lock all apps except Headspace |
|
||||
| On start | Detection | Unlock apps, stop sounds |
|
||||
| On complete | Logging | Log to Beeminder, update streak |
|
||||
| 9:00 PM | Check-in | Review day, update streak |
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
**Tonight (30 minutes):**
|
||||
|
||||
1. **Simple Time Tracker:**
|
||||
- [ ] Create "Meditation" activity
|
||||
- [ ] Set goal: 15 min daily
|
||||
- [ ] Add widget to home screen
|
||||
|
||||
2. **Tasker - Basic Setup:**
|
||||
- [ ] Profile: Time 7:00 AM → Notify
|
||||
- [ ] Profile: App Headspace → Set %MeditationDone=1
|
||||
- [ ] Test tomorrow morning
|
||||
|
||||
3. **Physical:**
|
||||
- [ ] Phone charging on meditation cushion
|
||||
- [ ] Headphones ready
|
||||
|
||||
**After 2-3 Days (If You're Ignoring It):**
|
||||
|
||||
1. **Tasker - Add Escalation:**
|
||||
- [ ] Add 7:15 AM Level 2 reminder (annoying)
|
||||
- [ ] Add 7:30 AM Level 3 reminder (very annoying)
|
||||
- [ ] Test escalation
|
||||
|
||||
**After 1 Week (If Still Struggling):**
|
||||
|
||||
1. **Tasker - Add Enforcement:**
|
||||
- [ ] Add 7:35 AM app locking
|
||||
- [ ] OR add SMS to accountability partner
|
||||
- [ ] OR set up Beeminder integration
|
||||
|
||||
**The key:** Start simple, add enforcement only if needed.
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
**Tasker Profiles for Meditation:**
|
||||
- r/Tasker - Search "habit enforcement"
|
||||
- TaskerNet - Download pre-made profiles
|
||||
|
||||
**Simple Time Tracker + Tasker:**
|
||||
- Simple Time Tracker supports intents/broadcasts
|
||||
- Check app settings → "Send intent on activity start/stop"
|
||||
|
||||
**Beeminder API:**
|
||||
- https://api.beeminder.com/#beeminder-api-reference
|
||||
- Tasker HTTP Post guide: https://tasker.joaoapps.com/userguide/en/help/ah_http_post.html
|
||||
|
||||
**App Locking with Tasker:**
|
||||
- Use "Block App" action (Tasker 6.0+)
|
||||
- Or create custom Scene that overlays all apps
|
||||
- Or integrate with AppBlock app
|
||||
|
||||
---
|
||||
|
||||
## Bottom Line
|
||||
|
||||
You don't need a new app. You have the tools to build something that **forces** you to meditate:
|
||||
|
||||
**Your advantage:**
|
||||
- Already using Tasker (most people don't have this skill)
|
||||
- Already using Simple Time Tracker (integrates with Tasker)
|
||||
- Power user mindset (you can customize everything)
|
||||
|
||||
**Your system:**
|
||||
1. Start simple: 7:00 AM Tasker notification
|
||||
2. Add escalation if needed: Annoying sounds, vibrations
|
||||
3. Add enforcement if still failing: Lock apps, text friend
|
||||
4. Add consequences if nuclear needed: Beeminder charges
|
||||
|
||||
**Start tonight with the basic profile. Build from there based on what you actually need.**
|
||||
@@ -1,6 +1,21 @@
|
||||
---
|
||||
created: 2025-11-02 10:48
|
||||
updated: 2025-11-02 10:48
|
||||
---
|
||||
# Gitea Setup on TrueNAS Scale
|
||||
|
||||
## Installation Options
|
||||
## Installation Status
|
||||
|
||||
✅ **Gitea is currently installed and working!**
|
||||
|
||||
- Deployed using Docker with Traefik reverse proxy
|
||||
- Accessible via HTTPS through Traefik
|
||||
- SSH access configured for git operations
|
||||
- All services operational
|
||||
|
||||
---
|
||||
|
||||
## Installation Options (Reference)
|
||||
|
||||
### Option 1: TrueNAS Scale Apps (Recommended for Beginners)
|
||||
|
||||
@@ -237,15 +252,21 @@ Plenty of headroom for other services.
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
## Completed Setup Steps
|
||||
|
||||
- [ ] Choose installation method (TrueNAS App vs Custom Docker)
|
||||
- [ ] Create storage dataset for Gitea data
|
||||
- [ ] Install Gitea
|
||||
- [ ] Complete initial setup wizard
|
||||
- [ ] Create admin account
|
||||
- [ ] Configure SSH access
|
||||
- [ ] Set up backup strategy
|
||||
- [ ] Migrate existing repositories
|
||||
- [ ] (Optional) Set up HTTPS with reverse proxy
|
||||
- [ ] (Optional) Configure external access via VPN or port forwarding
|
||||
- [x] Choose installation method (Custom Docker with Traefik)
|
||||
- [x] Create storage dataset for Gitea data
|
||||
- [x] Install Gitea
|
||||
- [x] Complete initial setup wizard
|
||||
- [x] Create admin account
|
||||
- [x] Configure SSH access
|
||||
- [x] Set up HTTPS with Traefik reverse proxy
|
||||
- [x] Configure external access via port forwarding
|
||||
|
||||
## Optional Next Steps
|
||||
|
||||
- [ ] Set up automated backup strategy
|
||||
- [ ] Migrate existing repositories from other platforms
|
||||
- [ ] Configure repository mirroring
|
||||
- [ ] Set up webhooks for CI/CD integration
|
||||
- [ ] Configure additional authentication providers (OAuth, LDAP)
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
---
|
||||
created: 2025-11-02 10:48
|
||||
updated: 2025-11-11 16:24
|
||||
---
|
||||
# TrueNAS Quick Reference
|
||||
|
||||
## Current Status
|
||||
|
||||
✅ **All services operational:**
|
||||
- Traefik (reverse proxy with SSL)
|
||||
- Gitea (git service)
|
||||
- Servarr stack (media automation)
|
||||
|
||||
---
|
||||
|
||||
## Common Commands
|
||||
|
||||
### Docker Management
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
created: 2025-11-02 10:47
|
||||
updated: 2025-11-02 10:47
|
||||
---
|
||||
# Recommended Setup for Your TrueNAS
|
||||
|
||||
## Your Situation
|
||||
@@ -256,18 +260,27 @@ If you already have:
|
||||
|
||||
---
|
||||
|
||||
## Next Steps Checklist
|
||||
## Setup Status
|
||||
|
||||
- [ ] Get Cloudflare API token/key
|
||||
- [ ] SSH into TrueNAS
|
||||
- [ ] Verify `/mnt/tank/stacks/` directory structure
|
||||
- [ ] Deploy Traefik stack
|
||||
- [ ] Configure router port forwarding (80, 443, 2222)
|
||||
- [ ] Add DNS records in Cloudflare
|
||||
- [ ] Deploy Gitea stack
|
||||
- [ ] Modify existing stack to connect to Traefik
|
||||
- [ ] Test access to all services via HTTPS
|
||||
- [ ] Configure backups
|
||||
### ✅ Completed Steps
|
||||
|
||||
- [x] Get Cloudflare API token/key
|
||||
- [x] SSH into TrueNAS
|
||||
- [x] Verify `/mnt/tank/stacks/` directory structure
|
||||
- [x] Deploy Traefik stack
|
||||
- [x] Configure router port forwarding (80, 443, 2222)
|
||||
- [x] Add DNS records in Cloudflare
|
||||
- [x] Deploy Gitea stack
|
||||
- [x] Test access to all services via HTTPS
|
||||
|
||||
**Status:** Git service is operational and working! 🎉
|
||||
|
||||
### 🔜 Optional Next Steps
|
||||
|
||||
- [ ] Modify existing Servarr stack to connect to Traefik (if desired)
|
||||
- [ ] Configure automated backups for Gitea
|
||||
- [ ] Set up additional services through Traefik
|
||||
- [ ] Configure Traefik dashboard access
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
created: 2025-11-02 10:47
|
||||
updated: 2025-11-02 10:47
|
||||
---
|
||||
# TrueNAS Server
|
||||
|
||||
## Overview
|
||||
@@ -22,11 +26,15 @@ Documentation for TrueNAS home server setup, configuration, and services.
|
||||
## Services & Applications
|
||||
|
||||
**Currently Deployed:**
|
||||
- Servarr Stack (VPN-routed media automation) - See [[servarr.yaml]]
|
||||
- ✅ **Traefik** - Reverse proxy with SSL management
|
||||
- ✅ **Gitea** - Self-hosted Git service (accessible via Traefik)
|
||||
- ✅ **Servarr Stack** - VPN-routed media automation - See [[servarr.yaml]]
|
||||
- Gluetun (ProtonVPN), qBittorrent, Sonarr, Radarr, Lidarr, Prowlarr, Bazarr, Recyclarr, Dozzle, Watchtower
|
||||
|
||||
**Status:** All services operational
|
||||
|
||||
**Start Here:**
|
||||
- [[Recommended Setup]] - ⭐ Your complete setup plan (Traefik + Gitea + existing stack)
|
||||
- [[Recommended Setup]] - ⭐ Setup guide (implemented and working)
|
||||
|
||||
**Detailed Guides:**
|
||||
- [[Traefik Multi-Stack Setup]] - One Traefik instance for multiple service stacks
|
||||
|
||||
157
Personal/Areas/Tasker/README.md
Normal file
157
Personal/Areas/Tasker/README.md
Normal file
@@ -0,0 +1,157 @@
|
||||
---
|
||||
created: 2025-11-11 16:30
|
||||
updated: 2025-11-11 16:30
|
||||
---
|
||||
# Tasker Routine Reminders Project
|
||||
|
||||
Standardized Tasker automation project for daily routine reminders with notification buttons that trigger actions.
|
||||
|
||||
## Project: Routine_Reminders.prj.xml
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
**Commands** (used in AutoNotification buttons/filters):
|
||||
- Format: `cmd_<action>_<target>`
|
||||
- Examples: `cmd_open_skincare_note`, `cmd_mark_skincare_done`
|
||||
|
||||
**Notification IDs**:
|
||||
- Format: `notif_<routine>_<time>`
|
||||
- Examples: `notif_skincare_morning`, `notif_exercise_prep`
|
||||
|
||||
**Profiles**:
|
||||
- Time triggers: `Trigger <Routine> Notification`
|
||||
- Event listeners: `Event: <Action> <Target>`
|
||||
|
||||
**Tasks**:
|
||||
- Notification display: `Show <Routine> Notification`
|
||||
- Actions: `<Action> <Target>` (e.g., `Open Skincare Note`, `Mark Exercise Done`)
|
||||
|
||||
### Project Structure
|
||||
|
||||
#### Time-Based Triggers (show notifications at specific times)
|
||||
- `Trigger Skincare Notification` → 7:30 AM → Shows skincare reminder
|
||||
- `Trigger Exercise Notification` → 11:30 AM → Shows exercise reminder
|
||||
|
||||
#### Event Listeners (respond to notification button taps)
|
||||
- `Event: Mark Skincare Done` → Listens for `cmd_mark_skincare_done` → Marks habit complete + dismisses notification
|
||||
- `Event: Mark Exercise Done` → Listens for `cmd_mark_exercise_done` → Dismisses notification
|
||||
- `Event: Open Skincare Note` → Listens for `cmd_open_skincare_done` → Opens Obsidian note
|
||||
- `Event: Open Exercise Note` → Listens for `cmd_open_exercise_note` → Opens Obsidian note
|
||||
|
||||
#### Notification Tasks (display the actual notifications)
|
||||
- `Show Skincare Notification` → Creates notification with buttons:
|
||||
- Button 1: "Open Note" → Sends `cmd_open_skincare_note`
|
||||
- Button 2: "Mark Done" → Sends `cmd_mark_skincare_done`
|
||||
- `Show Exercise Notification` → Creates notification with buttons:
|
||||
- Button 1: "Open Note" → Sends `cmd_open_exercise_note`
|
||||
- Button 2: "Mark Done" → Sends `cmd_mark_exercise_done`
|
||||
|
||||
#### Action Tasks (perform actual actions)
|
||||
- `Open Skincare Note` → Opens `Personal/Projects/Skincare/Skincare Morning` in Obsidian
|
||||
- `Open Exercise Note` → Opens exercise note in Obsidian
|
||||
- `Open Diet Note` → Opens diet note in Obsidian
|
||||
- `Mark Skincare Done` → Checks off habit in Loop Habit Tracker + dismisses notification
|
||||
- `Mark Exercise Done` → Dismisses notification
|
||||
|
||||
### How It Works
|
||||
|
||||
1. **At trigger time** (e.g., 7:30 AM):
|
||||
- Profile `Trigger Skincare Notification` activates
|
||||
- Runs task `Show Skincare Notification`
|
||||
- Notification appears with two buttons
|
||||
|
||||
2. **When button is tapped**:
|
||||
- AutoNotification sends command (e.g., `cmd_open_skincare_note`)
|
||||
- Event profile listens for that command (e.g., `Event: Open Skincare Note`)
|
||||
- Runs linked task (e.g., `Open Skincare Note`)
|
||||
- Opens Obsidian to the correct note
|
||||
|
||||
3. **When "Mark Done" is tapped**:
|
||||
- Sends `cmd_mark_skincare_done` command
|
||||
- `Event: Mark Skincare Done` profile catches it
|
||||
- Runs `Mark Skincare Done` task
|
||||
- Checks off habit in Loop Habit Tracker
|
||||
- Dismisses the notification
|
||||
|
||||
### Adding New Routines
|
||||
|
||||
To add a new routine (e.g., "Meditation"):
|
||||
|
||||
1. **Create time trigger profile**:
|
||||
- Name: `Trigger Meditation Notification`
|
||||
- Trigger: Time (e.g., 7:00 AM)
|
||||
- Task: `Show Meditation Notification`
|
||||
|
||||
2. **Create notification display task**:
|
||||
- Name: `Show Meditation Notification`
|
||||
- Action: AutoNotification
|
||||
- Notification ID: `notif_meditation_morning`
|
||||
- Button 1 command: `cmd_open_meditation_note`
|
||||
- Button 2 command: `cmd_mark_meditation_done`
|
||||
|
||||
3. **Create event listener profiles**:
|
||||
- `Event: Open Meditation Note` → Listens for `cmd_open_meditation_note`
|
||||
- `Event: Mark Meditation Done` → Listens for `cmd_mark_meditation_done`
|
||||
|
||||
4. **Create action tasks**:
|
||||
- `Open Meditation Note` → Opens Obsidian note
|
||||
- `Mark Meditation Done` → Marks habit complete + dismisses notification
|
||||
|
||||
### Dependencies
|
||||
|
||||
- **AutoNotification** (Joao Apps) - For creating interactive notifications and listening to button commands
|
||||
- **Loop Habit Tracker** - For checking off habits
|
||||
- **Obsidian** - For opening notes via obsidian:// URLs
|
||||
|
||||
### Files
|
||||
|
||||
- `Routine_Reminders.prj.xml` - Main project file (import into Tasker)
|
||||
- `Skincare_Demo_Standardized.prj.xml` - Original file before standardization
|
||||
- `standardize_tasker_v2.py` - Python script used for standardization
|
||||
|
||||
### Standardization Script
|
||||
|
||||
Run `standardize_tasker_v2.py` to:
|
||||
- Standardize all naming conventions
|
||||
- Link notification buttons to event profiles
|
||||
- Add missing event listeners
|
||||
- Remove trailing spaces and inconsistencies
|
||||
|
||||
```bash
|
||||
python3 standardize_tasker_v2.py
|
||||
```
|
||||
|
||||
### Import Instructions
|
||||
|
||||
1. Open Tasker
|
||||
2. Long-press Projects tab
|
||||
3. Select "Import Project"
|
||||
4. Navigate to `Routine_Reminders.prj.xml`
|
||||
5. Import
|
||||
6. Enable profiles
|
||||
|
||||
### Tips
|
||||
|
||||
- Use `cmd_` prefix for all AutoNotification commands (consistency + easy grep)
|
||||
- Use `notif_` prefix for all notification IDs (avoids conflicts)
|
||||
- Always create event listener profiles for button commands
|
||||
- Link event profiles to existing action tasks via `mid0` (task ID)
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
**Button doesn't do anything when tapped:**
|
||||
- Check that event profile exists for that command
|
||||
- Verify command name matches exactly (case-sensitive)
|
||||
- Check that event profile is enabled
|
||||
- Verify `mid0` in profile points to correct task ID
|
||||
|
||||
**Notification doesn't appear:**
|
||||
- Check time trigger is correct and profile is enabled
|
||||
- Verify notification display task is working (run manually)
|
||||
- Check AutoNotification permissions
|
||||
|
||||
**Wrong note opens:**
|
||||
- Check Obsidian URL in action task
|
||||
- Verify vault name and file path are correct
|
||||
- Test URL in browser first
|
||||
|
||||
2099
Personal/Areas/Tasker/Routine_Reminders.prj.xml
Normal file
2099
Personal/Areas/Tasker/Routine_Reminders.prj.xml
Normal file
File diff suppressed because it is too large
Load Diff
800
Personal/Areas/Tasker/Skincare_Demo.prj.xml
Normal file
800
Personal/Areas/Tasker/Skincare_Demo.prj.xml
Normal file
@@ -0,0 +1,800 @@
|
||||
<TaskerData sr="" dvi="1" tv="6.5.11">
|
||||
<Profile sr="prof104" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935025169</edate>
|
||||
<flags>8</flags>
|
||||
<id>104</id>
|
||||
<mid0>105</mid0>
|
||||
<nme>Launch Skincare Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>7</fh>
|
||||
<fm>30</fm>
|
||||
<th>7</th>
|
||||
<tm>30</tm>
|
||||
</Time>
|
||||
</Profile>
|
||||
<Profile sr="prof107" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>107</id>
|
||||
<mid0>108</mid0>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: mark skincare done </com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>mark skincare done </config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea8</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>
|
||||
<Profile sr="prof109" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935044697</edate>
|
||||
<flags>8</flags>
|
||||
<id>109</id>
|
||||
<mid0>110</mid0>
|
||||
<nme>Launch Prepare For Exercise Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>11</fh>
|
||||
<fm>30</fm>
|
||||
<th>11</th>
|
||||
<tm>30</tm>
|
||||
</Time>
|
||||
</Profile>
|
||||
<Profile sr="prof111" ve="2">
|
||||
<cdate>1762934954023</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<flags>8</flags>
|
||||
<id>111</id>
|
||||
<mid0>112</mid0>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: mark exercise done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>mark exercise done</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>6cbbccc1-1242-4f6a-861e-cfe4b82309fc</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>
|
||||
<Project sr="proj0" ve="2">
|
||||
<cdate>1762862634390</cdate>
|
||||
<name>Skincare Demo</name>
|
||||
<pids>111,107,109,104</pids>
|
||||
<psort>ActiveAlpha</psort>
|
||||
<tids>108,105,112,82,110</tids>
|
||||
</Project>
|
||||
<Task sr="task105">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762934992403</edate>
|
||||
<id>105</id>
|
||||
<nme>Open Skincare Notification</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<ActionIconString1><null></ActionIconString1>
|
||||
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
|
||||
<ActionIconString2><null></ActionIconString2>
|
||||
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
|
||||
<ActionIconString3><null></ActionIconString3>
|
||||
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
|
||||
<ActionIconString4><null></ActionIconString4>
|
||||
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
|
||||
<ActionIconString5><null></ActionIconString5>
|
||||
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
|
||||
<AppendTexts>false</AppendTexts>
|
||||
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
|
||||
<BackgroundColor><null></BackgroundColor>
|
||||
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
|
||||
<BadgeType><null></BadgeType>
|
||||
<BadgeType-type>java.lang.String</BadgeType-type>
|
||||
<Button1UnlockScreen>false</Button1UnlockScreen>
|
||||
<Button1UnlockScreen-type>java.lang.Boolean</Button1UnlockScreen-type>
|
||||
<Button2UnlockScreen>false</Button2UnlockScreen>
|
||||
<Button2UnlockScreen-type>java.lang.Boolean</Button2UnlockScreen-type>
|
||||
<Button3UnlockScreen>false</Button3UnlockScreen>
|
||||
<Button3UnlockScreen-type>java.lang.Boolean</Button3UnlockScreen-type>
|
||||
<Button4UnlockScreen>false</Button4UnlockScreen>
|
||||
<Button4UnlockScreen-type>java.lang.Boolean</Button4UnlockScreen-type>
|
||||
<Button5UnlockScreen>false</Button5UnlockScreen>
|
||||
<Button5UnlockScreen-type>java.lang.Boolean</Button5UnlockScreen-type>
|
||||
<ChronometerCountDown>false</ChronometerCountDown>
|
||||
<ChronometerCountDown-type>java.lang.Boolean</ChronometerCountDown-type>
|
||||
<Colorize>false</Colorize>
|
||||
<Colorize-type>java.lang.Boolean</Colorize-type>
|
||||
<DismissOnTouchVariable><null></DismissOnTouchVariable>
|
||||
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
|
||||
<ExtraInfo><null></ExtraInfo>
|
||||
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
|
||||
<GroupAlertBehaviour><null></GroupAlertBehaviour>
|
||||
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
|
||||
<GroupKey><null></GroupKey>
|
||||
<GroupKey-type>java.lang.String</GroupKey-type>
|
||||
<IconExpanded><null></IconExpanded>
|
||||
<IconExpanded-type>java.lang.String</IconExpanded-type>
|
||||
<IsGroupSummary>false</IsGroupSummary>
|
||||
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
|
||||
<IsGroupVariable><null></IsGroupVariable>
|
||||
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
|
||||
<MediaAlbum><null></MediaAlbum>
|
||||
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
|
||||
<MediaArtist><null></MediaArtist>
|
||||
<MediaArtist-type>java.lang.String</MediaArtist-type>
|
||||
<MediaDuration><null></MediaDuration>
|
||||
<MediaDuration-type>java.lang.String</MediaDuration-type>
|
||||
<MediaIcon><null></MediaIcon>
|
||||
<MediaIcon-type>java.lang.String</MediaIcon-type>
|
||||
<MediaLayout>false</MediaLayout>
|
||||
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
|
||||
<MediaNextCommand><null></MediaNextCommand>
|
||||
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
|
||||
<MediaPauseCommand><null></MediaPauseCommand>
|
||||
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
|
||||
<MediaPlayCommand><null></MediaPlayCommand>
|
||||
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
|
||||
<MediaPlaybackState><null></MediaPlaybackState>
|
||||
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
|
||||
<MediaPosition><null></MediaPosition>
|
||||
<MediaPosition-type>java.lang.String</MediaPosition-type>
|
||||
<MediaPreviousCommand><null></MediaPreviousCommand>
|
||||
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
|
||||
<MediaTrack><null></MediaTrack>
|
||||
<MediaTrack-type>java.lang.String</MediaTrack-type>
|
||||
<MessagingImages><null></MessagingImages>
|
||||
<MessagingImages-type>java.lang.String</MessagingImages-type>
|
||||
<MessagingOwnIcon><null></MessagingOwnIcon>
|
||||
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
|
||||
<MessagingOwnName><null></MessagingOwnName>
|
||||
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
|
||||
<MessagingPersonBot><null></MessagingPersonBot>
|
||||
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
|
||||
<MessagingPersonIcons><null></MessagingPersonIcons>
|
||||
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
|
||||
<MessagingPersonImportant><null></MessagingPersonImportant>
|
||||
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
|
||||
<MessagingPersonNames><null></MessagingPersonNames>
|
||||
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
|
||||
<MessagingPersonUri><null></MessagingPersonUri>
|
||||
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
|
||||
<MessagingSeparator><null></MessagingSeparator>
|
||||
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
|
||||
<MessagingTexts><null></MessagingTexts>
|
||||
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
|
||||
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
|
||||
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
|
||||
<NotificationChannelDescription><null></NotificationChannelDescription>
|
||||
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
|
||||
<NotificationChannelId><null></NotificationChannelId>
|
||||
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
|
||||
<NotificationChannelImportance><null></NotificationChannelImportance>
|
||||
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
|
||||
<NotificationChannelName><null></NotificationChannelName>
|
||||
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
|
||||
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
|
||||
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
|
||||
<PersistentVariable><null></PersistentVariable>
|
||||
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
|
||||
<PhoneOnly>false</PhoneOnly>
|
||||
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
|
||||
<PriorityVariable><null></PriorityVariable>
|
||||
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
|
||||
<PublicVersion><null></PublicVersion>
|
||||
<PublicVersion-type>java.lang.String</PublicVersion-type>
|
||||
<ReplyAction><null></ReplyAction>
|
||||
<ReplyAction-type>java.lang.String</ReplyAction-type>
|
||||
<ReplyChoices><null></ReplyChoices>
|
||||
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
|
||||
<ReplyLabel><null></ReplyLabel>
|
||||
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
|
||||
<ShareButtonsVariable><null></ShareButtonsVariable>
|
||||
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
|
||||
<SkipPictureCache>false</SkipPictureCache>
|
||||
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
|
||||
<SoundPath><null></SoundPath>
|
||||
<SoundPath-type>java.lang.String</SoundPath-type>
|
||||
<StatusBarIconString><null></StatusBarIconString>
|
||||
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<TextExpanded><null></TextExpanded>
|
||||
<TextExpanded-type>java.lang.String</TextExpanded-type>
|
||||
<Time><null></Time>
|
||||
<Time-type>java.lang.String</Time-type>
|
||||
<TimeFormat><null></TimeFormat>
|
||||
<TimeFormat-type>java.lang.String</TimeFormat-type>
|
||||
<Timeout><null></Timeout>
|
||||
<Timeout-type>java.lang.String</Timeout-type>
|
||||
<TitleExpanded><null></TitleExpanded>
|
||||
<TitleExpanded-type>java.lang.String</TitleExpanded-type>
|
||||
<UpdateNotification>false</UpdateNotification>
|
||||
<UpdateNotification-type>java.lang.Boolean</UpdateNotification-type>
|
||||
<UseChronometer>false</UseChronometer>
|
||||
<UseChronometer-type>java.lang.Boolean</UseChronometer-type>
|
||||
<UseHTML>false</UseHTML>
|
||||
<UseHTML-type>java.lang.Boolean</UseHTML-type>
|
||||
<Visibility><null></Visibility>
|
||||
<Visibility-type>java.lang.String</Visibility-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Morning Skincare
|
||||
Text: Go and be pretty!
|
||||
Action on Touch: Open morning skincare
|
||||
Status Bar Text Size: 16
|
||||
Id: skincare morning
|
||||
Separator: ,
|
||||
Button 1: open skincare note
|
||||
Label 1: Open Note
|
||||
Button 2: mark skincare done
|
||||
Label 2: Mark done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_action_1_icon><null></config_action_1_icon>
|
||||
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
|
||||
<config_action_2_icon><null></config_action_2_icon>
|
||||
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
|
||||
<config_action_3_icon><null></config_action_3_icon>
|
||||
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
|
||||
<config_action_4_icon><null></config_action_4_icon>
|
||||
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
|
||||
<config_action_5_icon><null></config_action_5_icon>
|
||||
<config_action_5_icon-type>java.lang.String</config_action_5_icon-type>
|
||||
<config_notification_action>Open morning skincare </config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>open skincare note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>mark skincare done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_button3><null></config_notification_action_button3>
|
||||
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
|
||||
<config_notification_action_button4><null></config_notification_action_button4>
|
||||
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
|
||||
<config_notification_action_button5><null></config_notification_action_button5>
|
||||
<config_notification_action_button5-type>java.lang.String</config_notification_action_button5-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_action_label3><null></config_notification_action_label3>
|
||||
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
|
||||
<config_notification_action_on_dismiss><null></config_notification_action_on_dismiss>
|
||||
<config_notification_action_on_dismiss-type>java.lang.String</config_notification_action_on_dismiss-type>
|
||||
<config_notification_action_share>false</config_notification_action_share>
|
||||
<config_notification_action_share-type>java.lang.Boolean</config_notification_action_share-type>
|
||||
<config_notification_command><null></config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<config_notification_content_info><null></config_notification_content_info>
|
||||
<config_notification_content_info-type>java.lang.String</config_notification_content_info-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_icon><null></config_notification_icon>
|
||||
<config_notification_icon-type>java.lang.String</config_notification_icon-type>
|
||||
<config_notification_indeterminate_progress>false</config_notification_indeterminate_progress>
|
||||
<config_notification_indeterminate_progress-type>java.lang.Boolean</config_notification_indeterminate_progress-type>
|
||||
<config_notification_led_color><null></config_notification_led_color>
|
||||
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
|
||||
<config_notification_led_off><null></config_notification_led_off>
|
||||
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
|
||||
<config_notification_led_on><null></config_notification_led_on>
|
||||
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
|
||||
<config_notification_max_progress><null></config_notification_max_progress>
|
||||
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
|
||||
<config_notification_number><null></config_notification_number>
|
||||
<config_notification_number-type>java.lang.String</config_notification_number-type>
|
||||
<config_notification_persistent>false</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_picture><null></config_notification_picture>
|
||||
<config_notification_picture-type>java.lang.String</config_notification_picture-type>
|
||||
<config_notification_priority><null></config_notification_priority>
|
||||
<config_notification_priority-type>java.lang.String</config_notification_priority-type>
|
||||
<config_notification_progress><null></config_notification_progress>
|
||||
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
|
||||
<config_notification_subtext><null></config_notification_subtext>
|
||||
<config_notification_subtext-type>java.lang.String</config_notification_subtext-type>
|
||||
<config_notification_text>Go and be pretty!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_ticker><null></config_notification_ticker>
|
||||
<config_notification_ticker-type>java.lang.String</config_notification_ticker-type>
|
||||
<config_notification_title>Morning Skincare </config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<config_notification_url><null></config_notification_url>
|
||||
<config_notification_url-type>java.lang.String</config_notification_url-type>
|
||||
<config_notification_vibration><null></config_notification_vibration>
|
||||
<config_notification_vibration-type>java.lang.String</config_notification_vibration-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err
|
||||
Error Code
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg
|
||||
Error Message
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>skincare morning </notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<notificaitionsound><null></notificaitionsound>
|
||||
<notificaitionsound-type>java.lang.String</notificaitionsound-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a25</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
<preferenceScreen><null></preferenceScreen>
|
||||
<preferenceScreen-type>java.lang.String</preferenceScreen-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task108">
|
||||
<cdate>1762862950419</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<id>108</id>
|
||||
<nme>Mark Skincare Done</nme>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2112800467</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<action>0</action>
|
||||
<action-type>java.lang.Integer</action-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Check: Morning routine</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<habit>11</habit>
|
||||
<habit-type>java.lang.Long</habit-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">org.isoron.uhabits</Str>
|
||||
<Str sr="arg2" ve="3">org.isoron.uhabits.automation.EditSettingActivity</Str>
|
||||
<Int sr="arg3" val="0"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task110">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762935044696</edate>
|
||||
<id>110</id>
|
||||
<nme>Open Prepare Exercise Notification</nme>
|
||||
<pri>100</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<ActionIconString1><null></ActionIconString1>
|
||||
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
|
||||
<ActionIconString2><null></ActionIconString2>
|
||||
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
|
||||
<ActionIconString3><null></ActionIconString3>
|
||||
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
|
||||
<ActionIconString4><null></ActionIconString4>
|
||||
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
|
||||
<ActionIconString5><null></ActionIconString5>
|
||||
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
|
||||
<AppendTexts>false</AppendTexts>
|
||||
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
|
||||
<BackgroundColor><null></BackgroundColor>
|
||||
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
|
||||
<BadgeType><null></BadgeType>
|
||||
<BadgeType-type>java.lang.String</BadgeType-type>
|
||||
<Button1UnlockScreen>false</Button1UnlockScreen>
|
||||
<Button1UnlockScreen-type>java.lang.Boolean</Button1UnlockScreen-type>
|
||||
<Button2UnlockScreen>false</Button2UnlockScreen>
|
||||
<Button2UnlockScreen-type>java.lang.Boolean</Button2UnlockScreen-type>
|
||||
<Button3UnlockScreen>false</Button3UnlockScreen>
|
||||
<Button3UnlockScreen-type>java.lang.Boolean</Button3UnlockScreen-type>
|
||||
<Button4UnlockScreen>false</Button4UnlockScreen>
|
||||
<Button4UnlockScreen-type>java.lang.Boolean</Button4UnlockScreen-type>
|
||||
<Button5UnlockScreen>false</Button5UnlockScreen>
|
||||
<Button5UnlockScreen-type>java.lang.Boolean</Button5UnlockScreen-type>
|
||||
<ChronometerCountDown>false</ChronometerCountDown>
|
||||
<ChronometerCountDown-type>java.lang.Boolean</ChronometerCountDown-type>
|
||||
<Colorize>false</Colorize>
|
||||
<Colorize-type>java.lang.Boolean</Colorize-type>
|
||||
<DismissOnTouchVariable><null></DismissOnTouchVariable>
|
||||
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
|
||||
<ExtraInfo><null></ExtraInfo>
|
||||
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
|
||||
<GroupAlertBehaviour><null></GroupAlertBehaviour>
|
||||
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
|
||||
<GroupKey><null></GroupKey>
|
||||
<GroupKey-type>java.lang.String</GroupKey-type>
|
||||
<IconExpanded><null></IconExpanded>
|
||||
<IconExpanded-type>java.lang.String</IconExpanded-type>
|
||||
<IsGroupSummary>false</IsGroupSummary>
|
||||
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
|
||||
<IsGroupVariable><null></IsGroupVariable>
|
||||
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
|
||||
<MediaAlbum><null></MediaAlbum>
|
||||
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
|
||||
<MediaArtist><null></MediaArtist>
|
||||
<MediaArtist-type>java.lang.String</MediaArtist-type>
|
||||
<MediaDuration><null></MediaDuration>
|
||||
<MediaDuration-type>java.lang.String</MediaDuration-type>
|
||||
<MediaIcon><null></MediaIcon>
|
||||
<MediaIcon-type>java.lang.String</MediaIcon-type>
|
||||
<MediaLayout>false</MediaLayout>
|
||||
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
|
||||
<MediaNextCommand><null></MediaNextCommand>
|
||||
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
|
||||
<MediaPauseCommand><null></MediaPauseCommand>
|
||||
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
|
||||
<MediaPlayCommand><null></MediaPlayCommand>
|
||||
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
|
||||
<MediaPlaybackState><null></MediaPlaybackState>
|
||||
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
|
||||
<MediaPosition><null></MediaPosition>
|
||||
<MediaPosition-type>java.lang.String</MediaPosition-type>
|
||||
<MediaPreviousCommand><null></MediaPreviousCommand>
|
||||
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
|
||||
<MediaTrack><null></MediaTrack>
|
||||
<MediaTrack-type>java.lang.String</MediaTrack-type>
|
||||
<MessagingImages><null></MessagingImages>
|
||||
<MessagingImages-type>java.lang.String</MessagingImages-type>
|
||||
<MessagingOwnIcon><null></MessagingOwnIcon>
|
||||
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
|
||||
<MessagingOwnName><null></MessagingOwnName>
|
||||
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
|
||||
<MessagingPersonBot><null></MessagingPersonBot>
|
||||
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
|
||||
<MessagingPersonIcons><null></MessagingPersonIcons>
|
||||
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
|
||||
<MessagingPersonImportant><null></MessagingPersonImportant>
|
||||
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
|
||||
<MessagingPersonNames><null></MessagingPersonNames>
|
||||
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
|
||||
<MessagingPersonUri><null></MessagingPersonUri>
|
||||
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
|
||||
<MessagingSeparator><null></MessagingSeparator>
|
||||
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
|
||||
<MessagingTexts><null></MessagingTexts>
|
||||
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
|
||||
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
|
||||
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
|
||||
<NotificationChannelDescription><null></NotificationChannelDescription>
|
||||
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
|
||||
<NotificationChannelId><null></NotificationChannelId>
|
||||
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
|
||||
<NotificationChannelImportance><null></NotificationChannelImportance>
|
||||
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
|
||||
<NotificationChannelName><null></NotificationChannelName>
|
||||
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
|
||||
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
|
||||
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
|
||||
<PersistentVariable><null></PersistentVariable>
|
||||
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
|
||||
<PhoneOnly>false</PhoneOnly>
|
||||
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
|
||||
<PriorityVariable><null></PriorityVariable>
|
||||
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
|
||||
<PublicVersion><null></PublicVersion>
|
||||
<PublicVersion-type>java.lang.String</PublicVersion-type>
|
||||
<ReplyAction><null></ReplyAction>
|
||||
<ReplyAction-type>java.lang.String</ReplyAction-type>
|
||||
<ReplyChoices><null></ReplyChoices>
|
||||
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
|
||||
<ReplyLabel><null></ReplyLabel>
|
||||
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
|
||||
<ShareButtonsVariable><null></ShareButtonsVariable>
|
||||
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
|
||||
<SkipPictureCache>false</SkipPictureCache>
|
||||
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
|
||||
<SoundPath><null></SoundPath>
|
||||
<SoundPath-type>java.lang.String</SoundPath-type>
|
||||
<StatusBarIconString><null></StatusBarIconString>
|
||||
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<TextExpanded><null></TextExpanded>
|
||||
<TextExpanded-type>java.lang.String</TextExpanded-type>
|
||||
<Time><null></Time>
|
||||
<Time-type>java.lang.String</Time-type>
|
||||
<TimeFormat><null></TimeFormat>
|
||||
<TimeFormat-type>java.lang.String</TimeFormat-type>
|
||||
<Timeout><null></Timeout>
|
||||
<Timeout-type>java.lang.String</Timeout-type>
|
||||
<TitleExpanded><null></TitleExpanded>
|
||||
<TitleExpanded-type>java.lang.String</TitleExpanded-type>
|
||||
<UpdateNotification>false</UpdateNotification>
|
||||
<UpdateNotification-type>java.lang.Boolean</UpdateNotification-type>
|
||||
<UseChronometer>false</UseChronometer>
|
||||
<UseChronometer-type>java.lang.Boolean</UseChronometer-type>
|
||||
<UseHTML>false</UseHTML>
|
||||
<UseHTML-type>java.lang.Boolean</UseHTML-type>
|
||||
<Visibility><null></Visibility>
|
||||
<Visibility-type>java.lang.String</Visibility-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Prepare for your exercise!
|
||||
Text: Go and load up!
|
||||
Action on Touch: Open morning skincare
|
||||
Icon: android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_ball
|
||||
Status Bar Icon: ic_launcher
|
||||
Status Bar Text Size: 16
|
||||
Id: prepare for exercise
|
||||
Priority: 2
|
||||
Separator: ,
|
||||
Button 1: open exercise note
|
||||
Label 1: Open Note
|
||||
Button 2: mark exercise done
|
||||
Label 2: Mark done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_action_1_icon><null></config_action_1_icon>
|
||||
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
|
||||
<config_action_2_icon><null></config_action_2_icon>
|
||||
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
|
||||
<config_action_3_icon><null></config_action_3_icon>
|
||||
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
|
||||
<config_action_4_icon><null></config_action_4_icon>
|
||||
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
|
||||
<config_action_5_icon><null></config_action_5_icon>
|
||||
<config_action_5_icon-type>java.lang.String</config_action_5_icon-type>
|
||||
<config_notification_action>Open morning skincare </config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>open exercise note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>mark exercise done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_button3><null></config_notification_action_button3>
|
||||
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
|
||||
<config_notification_action_button4><null></config_notification_action_button4>
|
||||
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
|
||||
<config_notification_action_button5><null></config_notification_action_button5>
|
||||
<config_notification_action_button5-type>java.lang.String</config_notification_action_button5-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_action_label3><null></config_notification_action_label3>
|
||||
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
|
||||
<config_notification_action_on_dismiss><null></config_notification_action_on_dismiss>
|
||||
<config_notification_action_on_dismiss-type>java.lang.String</config_notification_action_on_dismiss-type>
|
||||
<config_notification_action_share>false</config_notification_action_share>
|
||||
<config_notification_action_share-type>java.lang.Boolean</config_notification_action_share-type>
|
||||
<config_notification_command><null></config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<config_notification_content_info><null></config_notification_content_info>
|
||||
<config_notification_content_info-type>java.lang.String</config_notification_content_info-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_icon>android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_ball</config_notification_icon>
|
||||
<config_notification_icon-type>java.lang.String</config_notification_icon-type>
|
||||
<config_notification_indeterminate_progress>false</config_notification_indeterminate_progress>
|
||||
<config_notification_indeterminate_progress-type>java.lang.Boolean</config_notification_indeterminate_progress-type>
|
||||
<config_notification_led_color><null></config_notification_led_color>
|
||||
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
|
||||
<config_notification_led_off><null></config_notification_led_off>
|
||||
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
|
||||
<config_notification_led_on><null></config_notification_led_on>
|
||||
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
|
||||
<config_notification_max_progress><null></config_notification_max_progress>
|
||||
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
|
||||
<config_notification_number><null></config_notification_number>
|
||||
<config_notification_number-type>java.lang.String</config_notification_number-type>
|
||||
<config_notification_persistent>true</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_picture><null></config_notification_picture>
|
||||
<config_notification_picture-type>java.lang.String</config_notification_picture-type>
|
||||
<config_notification_priority>2</config_notification_priority>
|
||||
<config_notification_priority-type>java.lang.String</config_notification_priority-type>
|
||||
<config_notification_progress><null></config_notification_progress>
|
||||
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
|
||||
<config_notification_subtext><null></config_notification_subtext>
|
||||
<config_notification_subtext-type>java.lang.String</config_notification_subtext-type>
|
||||
<config_notification_text>Go and load up!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_ticker><null></config_notification_ticker>
|
||||
<config_notification_ticker-type>java.lang.String</config_notification_ticker-type>
|
||||
<config_notification_title>Prepare for your exercise!</config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<config_notification_url><null></config_notification_url>
|
||||
<config_notification_url-type>java.lang.String</config_notification_url-type>
|
||||
<config_notification_vibration><null></config_notification_vibration>
|
||||
<config_notification_vibration-type>java.lang.String</config_notification_vibration-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_icon config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid preferenceScreen config_notification_priority plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>prepare for exercise</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<notificaitionsound><null></notificaitionsound>
|
||||
<notificaitionsound-type>java.lang.String</notificaitionsound-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a25</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
<preferenceScreen>ic_launcher</preferenceScreen>
|
||||
<preferenceScreen-type>java.lang.String</preferenceScreen-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task112">
|
||||
<cdate>1762934967274</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<id>112</id>
|
||||
<nme>Dismiss Exercise Notification</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2046367074</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<App><null></App>
|
||||
<App-type>java.lang.String</App-type>
|
||||
<CancelAll>false</CancelAll>
|
||||
<CancelAll-type>java.lang.Boolean</CancelAll-type>
|
||||
<CancelPersistent>false</CancelPersistent>
|
||||
<CancelPersistent-type>java.lang.Boolean</CancelPersistent-type>
|
||||
<CaseinsensitiveApp>false</CaseinsensitiveApp>
|
||||
<CaseinsensitiveApp-type>java.lang.Boolean</CaseinsensitiveApp-type>
|
||||
<CaseinsensitivePackage>false</CaseinsensitivePackage>
|
||||
<CaseinsensitivePackage-type>java.lang.Boolean</CaseinsensitivePackage-type>
|
||||
<CaseinsensitiveText>false</CaseinsensitiveText>
|
||||
<CaseinsensitiveText-type>java.lang.Boolean</CaseinsensitiveText-type>
|
||||
<CaseinsensitiveTitle>false</CaseinsensitiveTitle>
|
||||
<CaseinsensitiveTitle-type>java.lang.Boolean</CaseinsensitiveTitle-type>
|
||||
<ExactApp>false</ExactApp>
|
||||
<ExactApp-type>java.lang.Boolean</ExactApp-type>
|
||||
<ExactPackage>false</ExactPackage>
|
||||
<ExactPackage-type>java.lang.Boolean</ExactPackage-type>
|
||||
<ExactText>false</ExactText>
|
||||
<ExactText-type>java.lang.Boolean</ExactText-type>
|
||||
<ExactTitle>false</ExactTitle>
|
||||
<ExactTitle-type>java.lang.Boolean</ExactTitle-type>
|
||||
<InterceptApps><StringArray sr=""/></InterceptApps>
|
||||
<InterceptApps-type>[Ljava.lang.String;</InterceptApps-type>
|
||||
<InvertApp>false</InvertApp>
|
||||
<InvertApp-type>java.lang.Boolean</InvertApp-type>
|
||||
<InvertPackage>false</InvertPackage>
|
||||
<InvertPackage-type>java.lang.Boolean</InvertPackage-type>
|
||||
<InvertText>false</InvertText>
|
||||
<InvertText-type>java.lang.Boolean</InvertText-type>
|
||||
<InvertTitle>false</InvertTitle>
|
||||
<InvertTitle-type>java.lang.Boolean</InvertTitle-type>
|
||||
<OtherId><null></OtherId>
|
||||
<OtherId-type>java.lang.String</OtherId-type>
|
||||
<OtherPackage><null></OtherPackage>
|
||||
<OtherPackage-type>java.lang.String</OtherPackage-type>
|
||||
<OtherTag><null></OtherTag>
|
||||
<OtherTag-type>java.lang.String</OtherTag-type>
|
||||
<PackageName><null></PackageName>
|
||||
<PackageName-type>java.lang.String</PackageName-type>
|
||||
<RegexApp>false</RegexApp>
|
||||
<RegexApp-type>java.lang.Boolean</RegexApp-type>
|
||||
<RegexPackage>false</RegexPackage>
|
||||
<RegexPackage-type>java.lang.Boolean</RegexPackage-type>
|
||||
<RegexText>false</RegexText>
|
||||
<RegexText-type>java.lang.Boolean</RegexText-type>
|
||||
<RegexTitle>false</RegexTitle>
|
||||
<RegexTitle-type>java.lang.Boolean</RegexTitle-type>
|
||||
<Text><null></Text>
|
||||
<Text-type>java.lang.String</Text-type>
|
||||
<Title><null></Title>
|
||||
<Title-type>java.lang.String</Title-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Id: prepare for exercise</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err
|
||||
Error Code
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg
|
||||
Error Message
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>prepare for exercise</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2d6b7e1a-427b-442e-9f39-356480bf35d2</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCancelNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigCancelNotification</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task82">
|
||||
<cdate>1762626933199</cdate>
|
||||
<edate>1762862747599</edate>
|
||||
<id>82</id>
|
||||
<nme>Open Skincare Note</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>104</code>
|
||||
<Str sr="arg0" ve="3">obsidian://open?vault=Personal&file=Personal%2FProjects%2FSkincare%2FSkincare%20Morning</Str>
|
||||
<App sr="arg1"/>
|
||||
<Int sr="arg2" val="0"/>
|
||||
<Str sr="arg3" ve="3"/>
|
||||
</Action>
|
||||
</Task>
|
||||
</TaskerData>
|
||||
1763
Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml
Normal file
1763
Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml
Normal file
File diff suppressed because it is too large
Load Diff
5
Personal/Areas/Tasker/Tasker.md
Normal file
5
Personal/Areas/Tasker/Tasker.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
created: 2025-11-12 09:21
|
||||
updated: 2025-11-12 09:25
|
||||
---
|
||||
![[Skincare_Demo_Standardized.prj.xml]]# Tasker![[Skincare_Demo.prj.xml]]
|
||||
312
Personal/Areas/Tasker/add_diet_routine.py
Normal file
312
Personal/Areas/Tasker/add_diet_routine.py
Normal file
@@ -0,0 +1,312 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Add "Evaluate Diet" routine to Tasker project
|
||||
- 21:00 (9:00 PM) notification
|
||||
- Open Note button
|
||||
- Mark Done button
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def add_diet_routine(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Find the highest profile and task IDs
|
||||
profile_ids = re.findall(r'<Profile sr="prof(\d+)"', content)
|
||||
task_ids = re.findall(r'<Task sr="task(\d+)"', content)
|
||||
|
||||
max_profile_id = max([int(pid) for pid in profile_ids]) if profile_ids else 150
|
||||
max_task_id = max([int(tid) for tid in task_ids]) if task_ids else 150
|
||||
|
||||
# New IDs
|
||||
new_profile_trigger_id = max_profile_id + 1
|
||||
new_profile_event_open_id = max_profile_id + 2
|
||||
new_profile_event_done_id = max_profile_id + 3
|
||||
new_task_show_id = max_task_id + 1
|
||||
new_task_done_id = max_task_id + 2
|
||||
|
||||
# Check if already exists
|
||||
if 'Trigger Diet Notification' in content:
|
||||
print("⚠ Diet routine already exists. Skipping.")
|
||||
return
|
||||
|
||||
# Find insertion point (before </TaskerData>)
|
||||
insert_point = content.rfind('</TaskerData>')
|
||||
|
||||
# Profile 1: Time trigger (21:00)
|
||||
profile_trigger = f'''
|
||||
<!-- Diet Evaluation Routine -->
|
||||
<Profile sr="prof{new_profile_trigger_id}" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<edate>1762935025169</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_trigger_id}</id>
|
||||
<mid0>{new_task_show_id}</mid0>
|
||||
<nme>Trigger Diet Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>21</fh>
|
||||
<fm>0</fm>
|
||||
<th>21</th>
|
||||
<tm>0</tm>
|
||||
</Time>
|
||||
</Profile>'''
|
||||
|
||||
# Profile 2: Event listener for "Open Diet Note" button
|
||||
profile_event_open = f'''
|
||||
<Profile sr="prof{new_profile_event_open_id}" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_event_open_id}</id>
|
||||
<mid0>63</mid0>
|
||||
<nme>Event: Open Diet Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_diet_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_diet_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aeb1</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>'''
|
||||
|
||||
# Profile 3: Event listener for "Mark Done" button
|
||||
profile_event_done = f'''
|
||||
<Profile sr="prof{new_profile_event_done_id}" ve="2">
|
||||
<cdate>1762934954023</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_event_done_id}</id>
|
||||
<mid0>{new_task_done_id}</mid0>
|
||||
<nme>Event: Mark Diet Done</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_mark_diet_done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_mark_diet_done</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>6cbbccc1-1242-4f6a-861e-cfe4b82309fd</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>'''
|
||||
|
||||
# Task 1: Show Diet Notification
|
||||
task_show = f'''
|
||||
<Task sr="task{new_task_show_id}">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762935044696</edate>
|
||||
<id>{new_task_show_id}</id>
|
||||
<nme>Show Diet Notification</nme>
|
||||
<pri>100</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Evaluate Your Diet
|
||||
Text: Time to review your eating today!
|
||||
Action on Touch: cmd_open_diet_note
|
||||
Status Bar Text Size: 16
|
||||
Id: notif_diet_evening
|
||||
Separator: ,
|
||||
Button 1: cmd_open_diet_note
|
||||
Label 1: Open Note
|
||||
Button 2: cmd_mark_diet_done
|
||||
Label 2: Mark Done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_notification_action>cmd_open_diet_note</config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>cmd_open_diet_note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>cmd_mark_diet_done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark Done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_persistent>false</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_text>Time to review your eating today!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_title>Evaluate Your Diet</config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>notif_diet_evening</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a26</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>'''
|
||||
|
||||
# Task 2: Mark Diet Done (dismiss notification)
|
||||
task_done = f'''
|
||||
<Task sr="task{new_task_done_id}">
|
||||
<cdate>1762934967274</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<id>{new_task_done_id}</id>
|
||||
<nme>Mark Diet Done</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2046367074</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<App><null></App>
|
||||
<App-type>java.lang.String</App-type>
|
||||
<CancelAll>false</CancelAll>
|
||||
<CancelAll-type>java.lang.Boolean</CancelAll-type>
|
||||
<CancelPersistent>false</CancelPersistent>
|
||||
<CancelPersistent-type>java.lang.Boolean</CancelPersistent-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Id: notif_diet_evening</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>notif_diet_evening</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2d6b7e1a-427b-442e-9f39-356480bf35d3</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCancelNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigCancelNotification</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>'''
|
||||
|
||||
# Combine all new elements
|
||||
new_elements = profile_trigger + profile_event_open + profile_event_done + task_show + task_done
|
||||
|
||||
# Insert before </TaskerData>
|
||||
content = content[:insert_point] + new_elements + '\n' + content[insert_point:]
|
||||
|
||||
# Update project pids (profile IDs)
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},{new_profile_trigger_id},{new_profile_event_open_id},{new_profile_event_done_id}</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Update project tids (task IDs)
|
||||
content = re.sub(
|
||||
r'<tids>([^<]+)</tids>',
|
||||
lambda m: f'<tids>{m.group(1)},{new_task_show_id},{new_task_done_id}</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Added 'Evaluate Diet' routine")
|
||||
print(f" - Trigger time: 21:00 (9:00 PM)")
|
||||
print(f" - Profile IDs: {new_profile_trigger_id}, {new_profile_event_open_id}, {new_profile_event_done_id}")
|
||||
print(f" - Task IDs: {new_task_show_id}, {new_task_done_id}")
|
||||
print(f" - Commands: cmd_open_diet_note, cmd_mark_diet_done")
|
||||
print(f" - Notification ID: notif_diet_evening")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
add_diet_routine(input_file, output_file)
|
||||
151
Personal/Areas/Tasker/standardize_tasker.py
Normal file
151
Personal/Areas/Tasker/standardize_tasker.py
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Standardize Tasker XML project file
|
||||
- Consistent naming conventions
|
||||
- Link notification buttons to correct tasks via AutoNotification commands
|
||||
- Remove trailing spaces and inconsistencies
|
||||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
def standardize_tasker_xml(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Standardize Profile names
|
||||
profile_replacements = {
|
||||
'Launch Skincare Notification': 'Trigger Skincare Notification',
|
||||
'Launch Prepare For Exercise Notification': 'Trigger Exercise Notification',
|
||||
'Open Skincare Notification': 'Show Skincare Notification',
|
||||
'Open Prepare Exercise Notification': 'Show Exercise Notification',
|
||||
'Dismiss Exercise Notification': 'Mark Exercise Done',
|
||||
}
|
||||
|
||||
for old, new in profile_replacements.items():
|
||||
content = content.replace(f'<nme>{old}</nme>', f'<nme>{new}</nme>')
|
||||
|
||||
# Standardize command names (used in AutoNotification event filters and button actions)
|
||||
command_replacements = {
|
||||
'Open morning skincare': 'cmd_open_skincare_note',
|
||||
'open skincare note': 'cmd_open_skincare_note',
|
||||
'mark skincare done': 'cmd_mark_skincare_done',
|
||||
'open exercise note': 'cmd_open_exercise_note',
|
||||
'mark exercise done': 'cmd_mark_exercise_done',
|
||||
'open diet note': 'cmd_open_diet_note',
|
||||
}
|
||||
|
||||
for old, new in command_replacements.items():
|
||||
# Remove trailing spaces from old commands
|
||||
old_variants = [old, old + ' ', old + ' ']
|
||||
for variant in old_variants:
|
||||
# Replace in command filters
|
||||
content = content.replace(
|
||||
f'<config_notification_command>{variant}</config_notification_command>',
|
||||
f'<config_notification_command>{new}</config_notification_command>'
|
||||
)
|
||||
# Replace in button actions
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button1>{variant}</config_notification_action_button1>',
|
||||
f'<config_notification_action_button1>{new}</config_notification_action_button1>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button2>{variant}</config_notification_action_button2>',
|
||||
f'<config_notification_action_button2>{new}</config_notification_action_button2>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action>{variant}</config_notification_action>',
|
||||
f'<config_notification_action>{new}</config_notification_action>'
|
||||
)
|
||||
|
||||
# Standardize notification IDs
|
||||
notif_id_replacements = {
|
||||
'skincare morning': 'notif_skincare_morning',
|
||||
'skincare morning ': 'notif_skincare_morning',
|
||||
'prepare for exercise': 'notif_exercise_prep',
|
||||
}
|
||||
|
||||
for old, new in notif_id_replacements.items():
|
||||
content = content.replace(
|
||||
f'<notificaitionid>{old}</notificaitionid>',
|
||||
f'<notificaitionid>{new}</notificaitionid>'
|
||||
)
|
||||
# Also update in BLURB text
|
||||
content = re.sub(
|
||||
f'Id: {re.escape(old)}([\\n<])',
|
||||
f'Id: {new}\\1',
|
||||
content
|
||||
)
|
||||
|
||||
# Standardize notification titles and texts (remove trailing spaces)
|
||||
content = re.sub(
|
||||
r'<config_notification_title>([^<]+?) +</config_notification_title>',
|
||||
r'<config_notification_title>\1</config_notification_title>',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'<config_notification_text>([^<]+?) +</config_notification_text>',
|
||||
r'<config_notification_text>\1</config_notification_text>',
|
||||
content
|
||||
)
|
||||
|
||||
# Update project name
|
||||
content = content.replace(
|
||||
'<name>Skincare Demo</name>',
|
||||
'<name>Routine Reminders</name>'
|
||||
)
|
||||
|
||||
# Fix BLURB descriptions to reflect standardized commands
|
||||
content = re.sub(
|
||||
r'Filter: mark skincare done[ ]*',
|
||||
'Filter: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Filter: mark exercise done[ ]*',
|
||||
'Filter: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open skincare note',
|
||||
'Button 1: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark skincare done',
|
||||
'Button 2: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open exercise note',
|
||||
'Button 1: cmd_open_exercise_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark exercise done',
|
||||
'Button 2: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open diet note',
|
||||
'Button 1: cmd_open_diet_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Action on Touch: Open morning skincare[ ]*',
|
||||
'Action on Touch: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Standardized {input_file}")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
standardize_tasker_xml(input_file, output_file)
|
||||
303
Personal/Areas/Tasker/standardize_tasker_v2.py
Normal file
303
Personal/Areas/Tasker/standardize_tasker_v2.py
Normal file
@@ -0,0 +1,303 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Standardize Tasker XML project file v2
|
||||
- Consistent naming conventions
|
||||
- Link notification buttons to correct tasks via AutoNotification commands
|
||||
- Add missing event profiles for button commands
|
||||
- Remove trailing spaces and inconsistencies
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def standardize_tasker_xml(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Standardize Profile names
|
||||
profile_replacements = {
|
||||
'Launch Skincare Notification': 'Trigger Skincare Notification',
|
||||
'Launch Prepare For Exercise Notification': 'Trigger Exercise Notification',
|
||||
'Open Skincare Notification': 'Show Skincare Notification',
|
||||
'Open Prepare Exercise Notification': 'Show Exercise Notification',
|
||||
'Dismiss Exercise Notification': 'Mark Exercise Done',
|
||||
}
|
||||
|
||||
for old, new in profile_replacements.items():
|
||||
content = content.replace(f'<nme>{old}</nme>', f'<nme>{new}</nme>')
|
||||
|
||||
# Standardize command names (used in AutoNotification event filters and button actions)
|
||||
command_replacements = {
|
||||
'Open morning skincare': 'cmd_open_skincare_note',
|
||||
'open skincare note': 'cmd_open_skincare_note',
|
||||
'mark skincare done': 'cmd_mark_skincare_done',
|
||||
'open exercise note': 'cmd_open_exercise_note',
|
||||
'mark exercise done': 'cmd_mark_exercise_done',
|
||||
'open diet note': 'cmd_open_diet_note',
|
||||
}
|
||||
|
||||
for old, new in command_replacements.items():
|
||||
# Remove trailing spaces from old commands
|
||||
old_variants = [old, old + ' ', old + ' ']
|
||||
for variant in old_variants:
|
||||
# Replace in command filters
|
||||
content = content.replace(
|
||||
f'<config_notification_command>{variant}</config_notification_command>',
|
||||
f'<config_notification_command>{new}</config_notification_command>'
|
||||
)
|
||||
# Replace in button actions
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button1>{variant}</config_notification_action_button1>',
|
||||
f'<config_notification_action_button1>{new}</config_notification_action_button1>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button2>{variant}</config_notification_action_button2>',
|
||||
f'<config_notification_action_button2>{new}</config_notification_action_button2>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action>{variant}</config_notification_action>',
|
||||
f'<config_notification_action>{new}</config_notification_action>'
|
||||
)
|
||||
|
||||
# Standardize notification IDs
|
||||
notif_id_replacements = {
|
||||
'skincare morning': 'notif_skincare_morning',
|
||||
'skincare morning ': 'notif_skincare_morning',
|
||||
'prepare for exercise': 'notif_exercise_prep',
|
||||
}
|
||||
|
||||
for old, new in notif_id_replacements.items():
|
||||
content = content.replace(
|
||||
f'<notificaitionid>{old}</notificaitionid>',
|
||||
f'<notificaitionid>{new}</notificaitionid>'
|
||||
)
|
||||
# Also update in BLURB text
|
||||
content = re.sub(
|
||||
f'Id: {re.escape(old)}([\\n<])',
|
||||
f'Id: {new}\\1',
|
||||
content
|
||||
)
|
||||
|
||||
# Standardize notification titles and texts (remove trailing spaces)
|
||||
content = re.sub(
|
||||
r'<config_notification_title>([^<]+?) +</config_notification_title>',
|
||||
r'<config_notification_title>\1</config_notification_title>',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'<config_notification_text>([^<]+?) +</config_notification_text>',
|
||||
r'<config_notification_text>\1</config_notification_text>',
|
||||
content
|
||||
)
|
||||
|
||||
# Update project name
|
||||
content = content.replace(
|
||||
'<name>Skincare Demo</name>',
|
||||
'<name>Routine Reminders</name>'
|
||||
)
|
||||
|
||||
# Fix BLURB descriptions to reflect standardized commands
|
||||
content = re.sub(
|
||||
r'Filter: mark skincare done[ ]*',
|
||||
'Filter: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Filter: mark exercise done[ ]*',
|
||||
'Filter: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open skincare note',
|
||||
'Button 1: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark skincare done',
|
||||
'Button 2: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open exercise note',
|
||||
'Button 1: cmd_open_exercise_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark exercise done',
|
||||
'Button 2: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open diet note',
|
||||
'Button 1: cmd_open_diet_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Action on Touch: Open morning skincare[ ]*',
|
||||
'Action on Touch: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
|
||||
# Add missing event profiles for "open note" commands
|
||||
# Find where to insert (before </TaskerData>)
|
||||
insert_point = content.rfind('</TaskerData>')
|
||||
|
||||
# Check if profiles already exist
|
||||
missing_profiles = []
|
||||
if 'Event: Open Skincare Note' not in content:
|
||||
missing_profiles.append('''
|
||||
<Profile sr="prof150" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>150</id>
|
||||
<mid0>82</mid0>
|
||||
<nme>Event: Open Skincare Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_skincare_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_skincare_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea9</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>''')
|
||||
|
||||
if 'Event: Open Exercise Note' not in content:
|
||||
missing_profiles.append('''
|
||||
<Profile sr="prof151" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>151</id>
|
||||
<mid0>141</mid0>
|
||||
<nme>Event: Open Exercise Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_exercise_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_exercise_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea0</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>''')
|
||||
|
||||
# Insert missing profiles
|
||||
if missing_profiles:
|
||||
profiles_text = ''.join(missing_profiles)
|
||||
content = content[:insert_point] + profiles_text + '\n' + content[insert_point:]
|
||||
|
||||
# Update project profile IDs (pids) to include new profiles
|
||||
if 'prof150' in profiles_text:
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},150</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
if 'prof151' in profiles_text:
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},151</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Standardized {input_file}")
|
||||
if missing_profiles:
|
||||
print(f"✓ Added {len(missing_profiles)} missing event profile(s) to link buttons to actions")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
print("\nStandardization complete!")
|
||||
print("- All command names use 'cmd_' prefix")
|
||||
print("- All notification IDs use 'notif_' prefix")
|
||||
print("- Profile/task names are consistent")
|
||||
print("- Button actions are linked to event profiles")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
standardize_tasker_xml(input_file, output_file)
|
||||
Reference in New Issue
Block a user