GithubHelp home page GithubHelp logo

hassio-addons's People

Contributors

kdw2060 avatar mika255 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

hassio-addons's Issues

wrong sort order of entity.state

I used the "onePersonNext4.yaml" card example and figured out, there is a wrong sort order. And the entry change some time just random, but he sync log shows all times the same order.

Using netxtcloud calender.

In the onePersonNext Card:
2022-11-17_17-02

sync log has every sync the same order:
2022-11-17_17-08

I used the card from you're examples:

type: custom:button-card name: person-x show_icon: false show_name: false entity: sensor.familien_kalender custom_fields: person: '[[[ return ` ]]]'
calendar: |
[[[ let calSnippet = '';
//entity.state = sorted(entity.state);
for (let i = 0; i < entity.state; i++) {
if (i > 3) {};
if (i <= 3 ) {
let start_month = entity.attributes.data[i].startMonth;
let start_day = entity.attributes.data[i].startDay;
let start_time = entity.attributes.data[i].startTime;
let end_month = entity.attributes.data[i].endMonth;
let end_day = entity.attributes.data[i].endDay;
let end_time = entity.attributes.data[i].endTime;
let time = start_time;
if (start_day !== end_day) {time = "Ganztägig"};
if (end_day === start_day +1 && start_time === end_time) {time = "ganse dag"};
let event = entity.attributes.data[i].summary;
let location = entity.attributes.data[i].location;
if (location === "" || location === undefined) {location = "-"}

calSnippet += 
  `<table><tr>
      <td class="date month">${start_month}</td>
      <td class="event"><div class="event-title">${event}</div></td>
    </tr>
    <tr>
      <td class="date day">${start_day}</td>
      <td class="event"><span class="location"><ha-icon class="icon" icon="mdi:map-marker"></ha-icon>${location}</span><span class="time"><ha-icon class="icon" icon="mdi:clock-outline"></ha-icon>${time}</span></td>
    </tr></table>`
    }
}
  
return calSnippet; ]]]

styles:
card:
- color: rgba(0, 0, 0, 0.82)
- margin-top: 1em
- box-shadow: none
grid:
- grid-template-areas: '"person" "calendar"'
- grid-template-columns: 1fr
- grid-template-rows: 1fr min-content
person:
- align-self: middle
style: |
img {
border-radius: 50%;
width: 120px;
margin-bottom: 1em;
}
.icon {
margin-right: 5%;
text-align: center;
float: left;
width: 16px;
}
table {
margin-left: 10px;
box-sizing: border-box;
border-spacing: 0;
margin-bottom: 1.25em;
width: 100%;
}
td {
white-space: -o-pre-wrap;
word-wrap: break-word;
white-space: pre-wrap;
white-space: -moz-pre-wrap;
white-space: -pre-wrap;
}
.date {
border-right: 2px solid #dc4225;
width: 20%;
text-align: center;
color: #e1e1e1;
}
.event, .task {
padding-left: 10px;
width: 80%;
color: #e1e1e1;
}
.month {
text-transform: uppercase;
vertical-align: bottom;
color: #e1e1e1;
}
.day {
font-size: 1.8em;
vertical-align: top;
color: #e1e1e1;
}
.event-title {
margin-top: 0;
font-size: 1.1em;
font-weight: 400;
text-align: left;
font-family: 'SF UI Text Semibold';
vertical-align: top;
word-wrap: break-word;
overflow-wrap: break-word;
color: #e1e1e1;
}
.time, .location {
display: block;
text-align: left;
font-size: 0.9em;
padding-top: 5px;
font-family: SF UI Text Regular;
color: #e1e1e1;
}
.time {
padding-bottom: 1em;
color: #e1e1e1;
}`

(feature request) Include historical events

Apologies in advance if this is not the right place for a feature request

First, this addon is awesome, i am working on a custom calendar for my wall mounted touchscreen (will share when its finished). It would be great to see past events as well, is there a way to do this? If not would be great to add in the future. Thanks!

Content after colon in description attribute not added to sensor

Hass Calendar Addon version: 0.200
Home Assistant Core: 2022.4.2
calType: caldav

I don't know if this is a bug or a limitation of caldav. I have events which have colons in the description field. Anything that comes after the colon in the description field is not picked up in the associated sensor attribute.

In the example below, the first event has 14:00 Army v Navy in the description field, but only 14 appears in the attribute. For the second event, I removed the colon so that the description reads 1400 Army v Navy, and the entire description field is picked up in the sensor attribute.

data:
  - description: '14'
    startDate: '2022-05-01T13:00:00.000Z'
    endDate: '2022-04-30T13:05:00.000Z'
    location: ''
    summary: Rugby Parking
    year: 22
    start_month: Apr
    start_month_digits: 4
    start_day: 30
    start_time: '14:00'
    end_month: Apr
    end_month_digits: 4
    end_day: 30
    end_time: '14:05'
  - description: 1400 Army v Navy
    startDate: '2022-05-01T13:00:00.000Z'
    endDate: '2022-04-30T13:05:00.000Z'
    location: ''
    summary: Rugby Parking - No colon
    year: 22
    start_month: Apr
    start_month_digits: 4
    start_day: 30
    start_time: '14:00'
    end_month: Apr
    end_month_digits: 4
    end_day: 30
    end_time: '14:05'

Calendar entries over several days have no endate

Hello,

I have a problem with the Caldav calendar entries over several days.

When I create a entrie over multiple days for example: 15.12.2022 to 20.12.2022 with whole day = true the attributs (starttime enddate, enddateISO, endMonth, endMonthDigits, endday and endtime) from calendar entity report NULL.

My automation doesn't work with multiple calendar entries with whole day =true. I have a script with tts which tells me every morning the calendar entries today.

My system:
HA Version 2022.11.5
OS: 9.3
Hass Calendar Addon: 0.301

With the Hass Calendar Addon version 0.202 it worked perfect.

Can anyone help?

Thank you!!
Mike

Error 405 when connecting to Nextcloud caldav

Hello, I am experiencing an error 405 when trying to connect to a Nextcloud calDav instance:

ˋˋˋ
Calendar(s) queried at: Sun Jan 08 2023 22:54:00 GMT+0100 (Central European Standard Time)
postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')
Events posted to sensor(s) at: Sun Jan 08 2023 22:54:00 GMT+0100 (Central European Standard Time)
axios error: [object Object]Request failed with status code 405
ˋˋˋ

On Nextcloud, I do have a user which holds about 10 different calendars (family, school etc.). I tried changging the URL from
https://my.nexcloud.url/address/
To
https://my.nextcloud.url/address/remot.php/dav/
as suggested by NC and then got an error 415 instead.

Since it is not one but 10 calendars, would there be a requirement to specify one of these calendars by its name (e.g. 'family'), or will they all end up in one set of sensors?

Fetching yearly-recurring events even tough not in range

Problem: yearly-recurring events are fetched even tough they are not in the configured range of 92d

Hi! Now that my synology caldav is working (thanks!), i've found a bug in the fetching of my calendar entries.
Even tough i'm only fetching the next 92days, it seems that all events that are recurring once a year are fetched.
This of course breaks the overall sorting...

I'm using your code snippet to display a lovelace card. It should show all days from 22. Jan to 27. Jan, but instead is also showing yearly-events in the past (27.8 Kennenlernen, 18.11 Jahrestag, 11.7 Verlobung and 20.12 Wohnung). Only the "Afterwork" event is a one-time event:
Screenshot 2023-01-22 at 14 16 54

Configuration

locale: de
timeZone: Europe/Berlin
fetchDays: 92
fetchDaysPast: 0
fetchCRON: "*/10 * * * *"
calendarList:
  - calName: calendar_mika
    calType: caldav
    username: "!secret caldav_mika_username"
    password: "!secret caldav_mika_password"
    caldavUrl: http://192.168.1.75/caldav.php/Mika/home/

Addon Logs

Calendar(s) queried at: Sun Jan 22 2023 14:20:00 GMT+0100 (Central European Standard Time)
Events posted to sensor(s) at: Sun Jan 22 2023 14:20:00 GMT+0100 (Central European Standard Time)
19 entries found in caldav calendar
Fetching caldav calendar entry 5C1361BF-01E2-4F5E-984E-B2B6D3F3B311.ics
Fetching caldav calendar entry 1D7EA1E4-E319-46A4-BB68-5261CCA003DA.ics
Fetching caldav calendar entry A2391435-BD91-40C6-87CD-1FAD6B831316.ics
Fetching caldav calendar entry 7061D403-997C-4505-80B6-1339C6CA00B7.ics
Fetching caldav calendar entry 3A61CE12-B41A-4AD1-A35B-239E2F86307D.ics
Fetching caldav calendar entry A6B83E1F-69D1-4EF2-A76A-B0C91C3AF8FD.ics
Fetching caldav calendar entry 85DF6445-BF7C-4CD0-9A10-00B2402BC3B4.ics
Fetching caldav calendar entry F011CAE8-31E8-4298-BBAB-9C35950217E7.ics
Fetching caldav calendar entry 035FBA3E-D5DF-47CB-B5F3-E6AD35BDFF92.ics
Fetching caldav calendar entry 3847AFC8-167F-4160-869D-0E8C602FA584.ics
Fetching caldav calendar entry 29B53842-C7AD-4EDC-BA48-EABFE1B015F7.ics
Fetching caldav calendar entry E4D384E6-D07C-4429-898B-5DF8D74A648F.ics
Fetching caldav calendar entry 2BFF3BE5-D1E7-46F3-9E30-37DFAA8051AE.ics
Fetching caldav calendar entry 63CBDC43-24B6-4DD7-86AD-545FE4A4F8DB.ics
Fetching caldav calendar entry EA3EC2C2-310B-43DA-A3C1-D164D2491361.ics
Fetching caldav calendar entry 95757C77-4C8A-498F-8611-273E32E1BF83.ics
Fetching caldav calendar entry 02105428-0BAF-4B37-B373-10DEEE8D604F.ics
Fetching caldav calendar entry 20230122T130036Z-uidGen%40fe80%3A0%3A0%3A0%3A225%3A90ff%3Afee7%3A4ade%25eth0.ics
Fetching caldav calendar entry 71BFD633-EC56-4FCF-A95E-BD20461E5923.ics
sorting events of calendar: calendar_mika

The card code-snipped i've took over, just changed to "i > 5" instead of "i > 3":

type: custom:button-card
name: Mika
show_icon: false
show_name: false
entity: sensor.calendar_mika
custom_fields:
  person: >-
    [[[ return `<img
    src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Image_created_with_a_mobile_phone.png/440px-Image_created_with_a_mobile_phone.png"/>`
    ]]]
  calendar: |
    [[[ let calSnippet = '';
    for (let i = 0; i < entity.state; i++) {
      if (i > 5) {};
      if (i <= 5 ) {
      let start_month = entity.attributes.data[i].startMonth;
      let start_day = entity.attributes.data[i].startDay;
      let start_time = entity.attributes.data[i].startTime;
      let end_month = entity.attributes.data[i].endMonth;
      let end_day = entity.attributes.data[i].endDay;
      let end_time = entity.attributes.data[i].endTime;
      let time = start_time;
      let wholeDay = entity.attributes.data[i].wholeDay;
      if (end_day != null && start_day !== end_day) {time = "Mehrtägig, bis " + end_day + " " + end_month};
      if (wholeDay === true) {time = "Ganztägig"};
      let event = entity.attributes.data[i].summary;
      let location = entity.attributes.data[i].location;
      if (location === "" || location === undefined) {location = "-"}

    calSnippet += 
      `<table><tr>
          <td class="date month">${start_month}</td><td class="event"><div class="event-title">${event}</div></td>
        </tr>
        <tr>
          <td class="date day">${start_day}</td><td class="event"><span class="location"><ha-icon class="icon" icon="mdi:map-marker"></ha-icon>${location}</span><span class="time"><ha-icon class="icon" icon="mdi:clock-outline"></ha-icon>${time}</span></td>
        </tr></table>`
        }
    }
      
    return calSnippet; ]]]
styles:
  card:
    - color: orange
    - margin-top: 1em
    - box-shadow: none
  grid:
    - grid-template-areas: '"person" "calendar"'
    - grid-template-columns: 1fr
    - grid-template-rows: 1fr min-content
  person:
    - align-self: middle
style: |
  img {
    border-radius: 50%;
    width: 120px;
    margin-bottom: 1em;
  }
  .icon {
    margin-right: 5%;
    text-align: center;
    float: left;
    width: 16px;
  }
  table {
    margin-left: 10px;
    box-sizing: border-box;
    border-spacing: 0;
    margin-bottom: 1.25em;
    width: 100%;
    color: blue;
  }
  td {
    white-space: -o-pre-wrap; 
    word-wrap: break-word;
    white-space: pre-wrap; 
    white-space: -moz-pre-wrap; 
    white-space: -pre-wrap; 
    color: white;
  }
  .date {
    border-right: 2px solid #aa6a0e;
    width: 20%;
    text-align: center;
  }
  .event, .task {
    padding-left: 10px;
    width: 80%;
  }
  .month {
    text-transform: uppercase;
    vertical-align: bottom;
  }
  .day {
    font-size: 1.8em;
    vertical-align: top;
  }
  .event-title {
    margin-top: 0;
    font-size: 1.1em;
    font-weight: 400;
    text-align: left;
    vertical-align: top;
    word-wrap: break-word;
    overflow-wrap: break-word;
  }
  .time, .location {
    display: block;
    text-align: left;
    font-size: 0.9em;
    padding-top: 5px;
  }
  .time {
    padding-bottom: 1em;
  }

Caldav Enddate is not transferred from ICS

Hi! For my caldav, the end-date is not being taken over from the ICS file.

ICS file read via POSTMAN

BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Apple Inc.//iOS 13.0.1//EN
VERSION:2.0
BEGIN:VEVENT
ATTENDEE;CN=Mika Vaaraniemi;CUTYPE=INDIVIDUAL;EMAIL=email@em
 ail.com;SCHEDULE-STATUS=3.7:mailto:[email protected]
ATTENDEE;CN=Mika;CUTYPE=INDIVIDUAL;[email protected];PARTSTAT=ACCEPT
 ED:mailto:[email protected]
CREATED:20221203T134548Z
DESCRIPTION:Österreich
DTEND;VALUE=DATE:20230205
DTSTAMP:20221203T134549Z
DTSTART;VALUE=DATE:20230131
LAST-MODIFIED:20221203T134548Z
ORGANIZER;CN=Mika;[email protected]:mailto:[email protected]
SEQUENCE:0
SUMMARY:Ischgl Skiing
TRANSP:TRANSPARENT
UID:035FBA3E-D5DF-47CB-B5F3-E6AD35BDFF92
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER:-PT15H
UID:20925DD3-0FC8-4B7A-BF9B-A2F4290945E4
X-APPLE-DEFAULT-ALARM:TRUE
X-WR-ALARMUID:20925DD3-0FC8-4B7A-BF9B-A2F4290945E4
END:VALARM
END:VEVENT
END:VCALENDAR

Resulting attributes in HA:

- summary: Ischgl Skiing
description: Österreich
startDate: 31.1.2023
startDateISO: '2023-01-31T00:00:00.000+01:00'
year: 2023
yearShort: 23
startMonth: Jan
startMonthDigits: 1
startDay: 31
startTime: null
endDate: null
endDateISO: null
endMonth: null
endMonthDigits: null
endDay: null
endTime: null
wholeDay: true
recurring: false

Note: Commenting out the following lines in index.js makes it work:

// Check if full day event and alter date parts accordingly

 // Check if full day event and alter date parts accordingly
                if (event.end.hasOwnProperty('dateOnly') || event.datetype == 'date') {
                    calendarItem.wholeDay = true;
                    calendarItem.startDate = DateTime.fromISO(event.start.toISOString()).toLocaleString();
                    calendarItem.startTime = null;
                    calendarItem.endDate = null;
                    calendarItem.endDateISO = null;
                    calendarItem.endMonth = null;
                    calendarItem.endMonthDigits = null;
                    calendarItem.endDay = null;
                    calendarItem.endTime = null;
                }

Error 404 while fetching events from Nextcloud

Hello, I'm trying to setup new caldav calendar stored in nextcloud and got this error:
error with: Error: Request failed with status code 404[object Object]

This what I got in nextcloud logs:
"GET /remote.php/dav/calendars/alsvartr/test/c167f8df-a884-463c-9217-e5f41288608b.ics HTTP/1.0" 404 248 "-" "axios/0.24.0"

This is a "subscription" calendar in nextcloud and I assume this is a cause. But other caldav clients works fine, including HA caldav integration.

Locale Not Found Error

Seeing the error below in the logs when I try to start the calendar addon.

23 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
node:internal/modules/cjs/loader:936
throw err;
^
Error: Cannot find module 'moment/locale/en'
Require stack:

  • /index.js
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object. (/index.js:11:1)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
    code: 'MODULE_NOT_FOUND',
    requireStack: [ '/index.js' ]
    }

Error: ENOENT: no such file or directory, open '/data/allFutureEvents.json'

I do get the follwing error message when I start the addon:

6-rc: info: service s6rc-oneshot-runner: starting

s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/00-banner.sh

Add-on: Hass Calendar Addon
Addon to consume caldav and google calendars and make calendar events available as sensordata in Home Assistant.

Add-on version: 0.301
You are running the latest version of this add-on.
System: null (amd64 / qemux86-64)
Home Assistant Core: 2023.1.1
Home Assistant Supervisor: 2022.12.1

Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.

cont-init: info: /etc/cont-init.d/00-banner.sh exited 0
cont-init: info: running /etc/cont-init.d/01-log-level.sh
cont-init: info: /etc/cont-init.d/01-log-level.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
added 80 packages, and audited 81 packages in 9s
23 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 9.1.2 -> 9.3.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.3.1
npm notice Run npm install -g [email protected] to update!
npm notice
System locale: en-US
Luxon locale set to: de
System timeZone: Europe/Berlin
node:internal/fs/utils:347
throw err;
^
Error: ENOENT: no such file or directory, open '/data/allFutureEvents.json'
at Object.openSync (node:fs:590:3)
at Object.readFileSync (node:fs:458:35)
at Object. (/index.js:509:30)
at Module._compile (node:internal/modules/cjs/loader:1165:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10)
at Module.load (node:internal/modules/cjs/loader:1043:32)
at Function.Module._load (node:internal/modules/cjs/loader:878:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47 {
errno: -2,
syscall: 'open',
code: 'ENOENT',
path: '/data/allFutureEvents.json'
}
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

My configuration is:

locale: de
timeZone: ""
fetchDays: 40
fetchDaysPast: 0
fetchCRON: "*/30 * * * *"
calendarList:

  • calName: calendar_work
    calType: google
    calId: 3ln******[email protected]
    googleServiceAccountKeyfile: home
    *******f40b2c0.json

[Question] decrease pulliing calendar pulls

Could you please guide me how i can chage the pulling from 30 minutes to 60 seconds? Will fork this repo and use modified version then :)

found:

// Getting and posting events every 30 minutes
cron.schedule("4,34 * * * *", () => {
  getEvents();
  console.log("Calendar(s) queried at: " + new Date());
});

cron.schedule("6,36 * * * *", () => {
  fs.writeFileSync("/data/allFutureEvents.json", JSON.stringify(allFutureEvents), (err) => {
    if (err) {
      console.log(err);
      return;
    }
  });
  postEventsAllCalendars();
  console.log("Events posted to sensor(s) at: " + new Date());
});

But how to change this to 60 seconds?

can this be right? :

// Getting and posting events every 30 minutes
cron.schedule("/1 * * * *", () => {
  getEvents();
  console.log("Calendar(s) queried at: " + new Date());
});

cron.schedule("/1 * * * *", () => {
  fs.writeFileSync("/data/allFutureEvents.json", JSON.stringify(allFutureEvents), (err) => {
    if (err) {
      console.log(err);
      return;
    }
  });
  postEventsAllCalendars();
  console.log("Events posted to sensor(s) at: " + new Date());
});

Icloud caldav error

Hello,
I wanted to connect an icloud calendar but I get the following error:

axios error: Request failed with status code 403[object Object]
Calendar(s) queried at: Sat Jun 04 2022 14:00:00 GMT+0200 (Central European Summer Time)
postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')
CRON-Task: Events posted to sensor(s) at: Sat Jun 04 2022 14:00:00 GMT+0200 (Central European Summer Time)

My configuration looks so:

locale: nl-be
fetchDays: 365
fetchCRON: '*/30 * * * *'
calendarList:
  - calName: Familie
    calType: caldav
    username: myicloudusername
    password: specific password
    caldavUrl: https://pxx-caldav.icloud.com/xxxxxxxxxxxxxxxxxx/calendars/archery/

I found out the URL via the icloud calendar. I published my calendar for a short time and it showed the parts for the URL

What make I wrong?

[tutorial] how to setup NextCloud caldav calendar

I am trying to setup the nectcloud caldav with this addon but won't get it work.
My config is:

calendarList:
  - calName: appointments
    calType: caldav
    locale: fr
    username: thorsten
    password: '%%xxxxxx%%'
    caldavUrl: https://cloud-space.ddns.net/remote.php/dav

Logs show only:

[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] done.
[services.d] starting services
[services.d] done.
added 62 packages, and audited 63 packages in 8s
21 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities```

Text after colon is truncated

A colon apparently ends each field, both the colon and the following text are missing.
"something: something else" ->"something".
This concerns at least the summary, probably other fields as well.

Error starting addon

Well this looks promising! Unbelievable that there is no way to get future events with the native HA calendar configuration.
I tried this addon, but I get the following error when starting it:

s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/00-banner.sh
-----------------------------------------------------------
 Add-on: Hass Calendar Addon
 Addon to consume caldav and google calendars and make calendar events available as sensordata in Home Assistant.
-----------------------------------------------------------
 Add-on version: 0.302
 You are running the latest version of this add-on.
 System: Home Assistant OS 10.3  (amd64 / qemux86-64)
 Home Assistant Core: 2023.7.3
 Home Assistant Supervisor: 2023.07.1
-----------------------------------------------------------
 Please, share the above information when looking for help
 or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
cont-init: info: /etc/cont-init.d/00-banner.sh exited 0
cont-init: info: running /etc/cont-init.d/01-log-level.sh
cont-init: info: /etc/cont-init.d/01-log-level.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
added 81 packages, and audited 82 packages in 9s
24 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities
npm notice 
npm notice New minor version of npm available! 9.1.2 -> 9.8.1
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.8.1>
npm notice Run `npm install -g [email protected]` to update!
npm notice 
System locale: en-US
Luxon locale set to: en-US
System timeZone: Europe/Amsterdam
/node_modules/node-cron/src/convert-expression/month-names-conversion.js:10
            expression = expression.replace(new RegExp(items[i], 'gi'), parseInt(i, 10) + 1);
                                    ^
TypeError: Cannot read properties of undefined (reading 'replace')
    at convertMonthName (/node_modules/node-cron/src/convert-expression/month-names-conversion.js:10:37)
    at interprete (/node_modules/node-cron/src/convert-expression/month-names-conversion.js:16:27)
    at interprete (/node_modules/node-cron/src/convert-expression/index.js:54:26)
    at validate (/node_modules/node-cron/src/pattern-validation.js:117:32)
    at new TimeMatcher (/node_modules/node-cron/src/time-matcher.js:14:9)
    at new Scheduler (/node_modules/node-cron/src/scheduler.js:9:28)
    at new ScheduledTask (/node_modules/node-cron/src/scheduled-task.js:22:27)
    at createTask (/node_modules/node-cron/src/node-cron.js:36:12)
    at Object.schedule (/node_modules/node-cron/src/node-cron.js:25:18)
    at Object.<anonymous> (/index.js:557:6)
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

And this is my config (Radicale server):

locale: nl-NL
timeZone: ""
fetchDays: 10
fetchDaysPast: 0
fetchCRON: "3"
calendarList:
  - calName: Verjaardagen
    calType: caldav
    username: <username>
    password: <password>
    caldavUrl: https://<domain>:<port>/<username>/verjaardagen/

I have no clue what could be wrong here. I tried waiting it out like mentioned in the docs, but then I found out that the addon stops immediately after starting (as mentioned in the log). Can you help me?

Edit
After looking at the logs for Radicale and Nginx (reverse proxy), it seems that the addon never reaches Radicale server.

Incorrect start date

I have this setup for a icloud calendar but I noticed that the start date seems to add 1 day:

data: 
- endDate: '2022-10-10T18:00:00.000Z'
  startDate: '2022-10-11T16:00:00.000Z'

The event above goes from 16:00 to 18:00 on 2022-10-10, not start the day after it ends.

Error updating Hass Calendar Addon

[281472787969856] Error updating Hass Calendar Addon: The command '/bin/bash -o pipefail -c apt-get update && curl -s -fsSL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y --no-install-recommends tzdata=2022f-0ubuntu0.20.04.0 nodejs && npm install -g [email protected] && apt-get -y clean && rm -fr /tmp/* /var/{cache,log}/* /var/lib/apt/lists/*' returned a non-zero code: 1
got this in the log.
supervised install on Debian 12 (bookworm), raspi 4
Do you need more info on this?

add originalYear to available values

Hi I'm trying to setup your addon with an Alexa notification that tells me each day if there is a birthday in my calendar, if so it will tell me the entry's summary and then calucaltes the age of that person.

This should ofc only work if the year of birth is known.

Maybe you can add the originalYear that makes the past calculation a lot easier then? :)

That is what I have done right now:

{{state_attr('sensor.geburtstage', 'data')[0].summary}} Alter:
{{now().strftime('%Y') | int - state_attr('sensor.geburtstage',
'data')[0].originalStartDate[:4] | int}}

installes the addon...

Hi, just installed the addon. But now. What is the next step to get the calendar? There is a script in you description. is this needed? Where to put it?

Home Assistant goes down when I start the addon

It's hard to tell what's going wrong. Maybe my config but it brings my entire HA instance down for a few minutes. It will eventually start again but I'm unable to figure out what it is that restarts it.

Any suggestions?

Baikal sync not working

Thanks very much for the add on. I am trying to it working with self hosted Baikal without success. I can sync with the Baikal calendar using desktop applications like 1Calendar.

Add on log:

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] done.
[services.d] starting services
[services.d] done.
added 62 packages, and audited 63 packages in 7s
21 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities
error: Request failed with status code 500[object Object]
Calendar(s) queried at: Tue Apr 12 2022 11:00:00 GMT+0100 (British Summer Time)
postEventsAllCalendars error: TypeError: Cannot read property 'length' of undefined
CRON-Task: Events posted to sensor(s) at: Tue Apr 12 2022 11:00:00 GMT+0100 (British Summer Time)

Nothing at all appears in the Baikal log.

I noticed that with version 0.200 support for Baikal calldav calendars is added. Presumably that means that the following from the docs no longer applies: "The add-on uses the jcal format querying the server. Make sure this plugin is installed in your Baikal instance. See Baikal Plugin Info for more information."

Add on configuration:

locale: en-gb
fetchDays: 365
fetchCRON: '*/30 * * * *'
calendarList:
  - calName: twickenhamevent
    calType: baikal
    username: xxxxx
    password: xxxxx
    caldavUrl: http://xxx.xxx.xxx.xxx:xxxx/dav.php/calendars/136worple/twickenhamevent

One thing I notice versus the documentation is that I'm not using SSL whereas the documenation notes using an https address.

Any ideas? Thank you.

error: sync caldav

Hello,

First of all, i would say thank you for this great addon.

Since I have updated to the newest version (0.201) I have sync problems with my caldav account (Synology Calendar). In version 0.200 everything works fine.
I use a synology NAS with the caldav calendar integration.

The following error message is shown in the log:
CRON-Task: Events posted to sensor(s) at: Tue May 17 2022 06:11:23 GMT+0000 (Coordinated Universal Time) Calendar(s) queried at: Tue May 17 2022 06:12:23 GMT+0000 (Coordinated Universal Time) postEvents error with: Error: Request failed with status code 401 postEvents error with: Error: Request failed with status code 401

Currently I have set the addon back to version 0.200 and everything works fine again.
Maybe something is wrong with the update to 0.201?

Thank you for your help!

Failed to restart Hass Calendar Addon

Hi,
thanks the addonn I am trying to make it work, running it for the first time trying to fetch claendar data from synology using Caldav

I have tried a new calendar with couple of test events in there.

Failed to restart Hass Calendar Addon Can't create container from addon_6a4ec433_hass_calendar_addon: 409 Client Error for http+docker://localhost/v1.41/containers/create?name=addon_6a4ec433_hass_calendar_addon: Conflict ("Conflict. The container name "/addon_6a4ec433_hass_calendar_addon" is already in use by container "0457bff207494b354f1ab1ae94574e36ffa658bd483734f2996744be01c0530a". You have to remove (or rename) that container to be able to reuse that name.")

`s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/00-banner.sh

parse error: Expected string key before ':' at line 1, column 4
[10:56:12] ERROR: Unknown HTTP error occured
Add-on:


Add-on version:
You are running the latest version of this add-on.
parse error: Expected string key before ':' at line 1, column 4
[10:56:12] ERROR: Unknown HTTP error occured
System: ( / )
Home Assistant Core:
Home Assistant Supervisor:

Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------`

Please advie?

Synology caldav - Request failed with status code 403

Hi, i'm having having a very similar problem as written in the setup guide, but even tough i'm waiting for several retries, it doesn't seem to initiate my caldav calendar: It's not creating an entity called "calendar-mika". I'm getting the following error:

Calendar(s) queried at: Sat Jan 21 2023 16:30:00 GMT+0100 (Central European Standard Time)
postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')
Events posted to sensor(s) at: Sat Jan 21 2023 16:30:00 GMT+0100 (Central European Standard Time)
axios error: [object Object]Request failed with status code 403

My caldav calendar works as default home assistant calendar.

I've check this problem, but seems just waiting solved it here:
#29

My setup
Home Assistant 2023.1.6
Supervisor 2022.12.1
Frontend 20230110.0 - latest
It's running inside a docker container of my Synology 720+

Here is my config

locale: de
timeZone: Europe/Berlin
fetchDays: 365
fetchDaysPast: -7
fetchCRON: "*/30 * * * *"
calendarList:
  - calName: calendar-mika
    calType: caldav
    username: XXXX
    password: YYYY
    caldavUrl: http://192.168.1.75:8000/caldav.php/Mika/

Here are the logs of this add-on:

s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
cont-init: info: running /etc/cont-init.d/00-banner.sh

-----------------------------------------------------------
 Add-on: Hass Calendar Addon
 Addon to consume caldav and google calendars and make calendar events available as sensordata in Home Assistant.
-----------------------------------------------------------
 Add-on version: 0.301
 You are running the latest version of this add-on.
 System: null  (amd64 / qemux86-64)
 Home Assistant Core: 2023.1.6
 Home Assistant Supervisor: 2022.12.1
-----------------------------------------------------------
 Please, share the above information when looking for help
 or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
cont-init: info: /etc/cont-init.d/00-banner.sh exited 0
cont-init: info: running /etc/cont-init.d/01-log-level.sh
cont-init: info: /etc/cont-init.d/01-log-level.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started

added 80 packages, and audited 81 packages in 8s

23 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice 
npm notice New minor version of npm available! 9.1.2 -> 9.3.1
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.3.1>
npm notice Run `npm install -g [email protected]` to update!
npm notice 
System locale: en-US
Luxon locale set to: de
System timeZone: Europe/Berlin
Luxon timezone set to: Europe/Berlin
Calendar(s) queried at: Sat Jan 21 2023 16:30:00 GMT+0100 (Central European Standard Time)
postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')
Events posted to sensor(s) at: Sat Jan 21 2023 16:30:00 GMT+0100 (Central European Standard Time)
axios error: [object Object]Request failed with status code 403

Install is failing :(

Failed to install add-on
The command '/bin/ash -o pipefail -c apk add --no-cache nodejs-npm' returned a non-zero code: 1

postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')

I'm getting what seems to be an intermittent error.

postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')

Which seemingly causes all HASS Calendar data to be unavailable - i.e. the cards using that data go blank.

Add-On log shows the error above, supervisor log shows (not very helpful):

WARNING (MainThread) [supervisor.addons.addon] Watchdog found addon Hass Calendar Addon is failed, restarting...

I'm assuming that one of the calendars has no events on one of the days - but it feels like the add-on should be more robust than that.

Using both Gmail and Caldav calendars

Don't install on Hassio (x86)

Hi

I added the github in repository list and when I try to install the calendar integration I get that error:

2022-10-16 17 44 28 n6i71nveptxx72q10614vld17u87jnhh ui nabu casa 3051ce691ffd

I'm running Hassio on x86 platform (latest version:

Home Assistant 2022.10.4
Supervisor 2022.10.0
Operating System 9.2
Interface utilisateur : 20221010.0 - latest

Thanks

Vincèn

postEventsAllCalendars error: TypeError: Cannot read properties of undefined (reading 'length')

Hi There. I've spent a few hours on this and despite reading the other issues logs - I'm not getting anywhere.

Trying to sync with Google Calendar and keep getting the above error message. Tips that seem to have helped others aren't working in this case:

  • Service account has been email given permission for the calendar
  • Google Calendar API has been enabled
  • calId is set correctly
  • googleServiceAccountKeyfile confirmed to be in /share and spelled correctly

A previous comment said that this error just means that the calendar is empty for the date range queried but that isn't the case.

I'm out of ideas. It would be great if there was a verbose logging mode that could let me know how many calendars/events/etc were being returned and whether data was being written etc.

On looking at the code in index.js it seems like the issue may be when let numberOfEvents = events[${sensorName}].length; is called in line 346 which I assume might mean there is an issue with the allFutureEvents.json (which seems to not be being written). I'm a bit of a noob when it comes to home assistant though so that could be well wrong. FWIW here is my config

locale: en-gb
fetchDays: 365
fetchCRON: "*/30 * * * *"
calendarList:

  • calName: planner
    calType: google
    calId: email@email
    googleServiceAccountKeyfile: filename

Hass Calendar addon -> Error on start

Hello, thank you for developping this nice add-on, Home Assistant is definitely lacking the possibility to get more than 1 event from a calendar.

I did setup the addon following your guide and having this configuration:

  calType: google
  calId: *******@gmail.com
  googleServiceAccountKeyfile: home-assistant-mykey.json

Starting the add-on I always have the following log:

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] done.
[services.d] starting services
[services.d] done.
added 62 packages, and audited 63 packages in 14s
21 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities
internal/fs/utils.js:332
    throw err;
    ^
Error: ENOENT: no such file or directory, open '/data/allFutureEvents.json'
    at Object.openSync (fs.js:497:3)
    at Object.readFileSync (fs.js:393:35)
    at Object.<anonymous> (/index.js:378:30)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)
    at internal/main/run_main_module.js:17:47 {
  errno: -2,
  syscall: 'open',
  code: 'ENOENT',
  path: '/data/allFutureEvents.json'
}
[cmd] /run.sh exited 1
[cont-finish.d] executing container finish scripts...
[cont-finish.d] done.
[s6-finish] waiting for services.
[s6-finish] sending all processes the TERM signal.

Am I doing something wrong? Thanks for your help :)

Today Only

Is there a way to fetch only the calendar data for today and not for 1 day? Looks like 1 day in the settings is the equivalent of 24 hours. I'd like to only fetch and use the events for that specific day.

Integration not creating a sensor for calendar data

Hi hopeful all is well.

I need a little help in understanding what I may not be doing correctly with your caldav integration. From what I can tell it is not creating a sensor to display the data.

I host my calendar on a Synology NAS and remotely access it with CalDav.

This is my add-on config
locale: en-US
timeZone: America/New_York
fetchDays: 365
fetchDaysPast: -7
fetchCRON: "*/30 * * * *"
calendarList:

Log file when I start the add-on
Add-on: Hass Calendar Addon
Addon to consume caldav and google calendars and make calendar events available as sensordata in Home Assistant.

Add-on version: 0.301
You are running the latest version of this add-on.
System: Home Assistant OS 9.3 (amd64 / qemux86-64)
Home Assistant Core: 2022.12.3
Home Assistant Supervisor: 2022.11.2

Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.

cont-init: info: /etc/cont-init.d/00-banner.sh exited 0
cont-init: info: running /etc/cont-init.d/01-log-level.sh
cont-init: info: /etc/cont-init.d/01-log-level.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
added 80 packages, and audited 81 packages in 25s
23 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 9.1.2 -> 9.2.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.2.0
npm notice Run npm install -g [email protected] to update!
npm notice
System locale: en-US
Luxon locale set to: en-US
System timeZone: America/New_York
Luxon timezone set to: America/New_York

and I Que it gives this
Fetching caldav calendar entry da9f59fd-a97f-43d5-aa35-c2dd5d69fb6f.ics
Fetching caldav calendar entry 510b4f7a-2ba7-4ff5-a1f0-8bb5d3b523aa.ics
Fetching caldav calendar entry 3f4cca76-534c-4f8a-adbf-e94ff9128817.ics
sorting events of calendar: EWVisualArts
and stops here.

I do have this sensor that is created
update.hass_calendar_addon_update
Hass Calendar Addon Update
off
auto_update: false
installed_version: 0.301
in_progress: false
latest_version: 0.301
release_summary: # Changelog

0.301 | 2022-11-19

Bugfix for sorting of caldav calendar events.

0.300 | 2022-11-15

🎁 NEW

  • Now with proper recurring events support for caldav calendars (limited to yearly, monthly, weekly, daily recurring). Check out the docs for m
    release_url: null
    skipped_version: null
    title: Hass Calendar Addon
    entity_picture: /api/hassio/addons/6a4ec433_hass_calendar_addon/icon
    friendly_name: Hass Calendar Addon Update
    supported_features: 25

I can pull all the calendar events into HA using the manual calendar integration.

Any help would be greatly appreciated.
Thank you
Ed

Add support for tasks?

The addon is very helpful, thank you! Would there be the possibility to support tasks (caldav)? No errors are displayed in the log, but the data field remains empty. Would be great and should thereby probably also be suitable for Nextcloud.

Apple Calendar Issue

Trying to get this working with my icloud calendar but keep getting this error:

Previously stored events posted to sensor(s) at: Sat Apr 02 2022 13:49:09 GMT+0100 (British Summer Time)
Calendar(s) queried at: Sat Apr 02 2022 14:04:00 GMT+0100 (British Summer Time)
axios error: getaddrinfo ENOTFOUND p45.icloud.comundefined
Events posted to sensor(s) at: Sat Apr 02 2022 14:06:00 GMT+0100 (British Summer Time)

I get this before it tries to download the calendar update:

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] done.
[services.d] starting services
[services.d] done.
added 62 packages, and audited 63 packages in 29s
21 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities

This is my config:

calendarList:
  - calName: worktest
    calType: caldav
    locale: en-gb
    username: ****
    password: ****
    caldavUrl: https://p**-caldav.icloud.com/*********/calendars/Lou Work

fetch days past for specific calendar in the calendarlist

Hello,

Is it possible to add the function "fetchDaysPast" for specific calendar not for all calendar in the calendarlist?
see the example below.

locale: de-ch
timeZone: ""
fetchDays: 365
fetchCRON: "*/30 * * * *"
calendarList:

  • calName: calendar_1
    fetchDaysPast: -365
    calType: caldav
    username: ""
    password: ""
    caldavUrl: ""
  • calName: calendar_2
    fetchDaysPast: 0
    calType: caldav
    username: ""
    password: ""
    caldavUrl: ""

Thank you for the answer.

Mike

ButtonCardJSTemplateError

Hey there kdw2060!
I'm trying to implement it to my dashboard and getting the following error:
ButtonCardJSTemplateError: TypeError: Cannot read properties of undefined (reading 'state') in 'let calSnippet = ''; for (let i = 0; i < entity.state; i++) { if (i > 3) {}; if (i <= 3 ) { ...'

Code I used to try:
https://pastebin.com/WXmvzmSU

only reccurring birthday entries

Hi Kris,
first of all thanks for your great add-on, much appreciated!
Since the last update, however, I ran into a little issue. All birthday entries are not marked as recurring and are sorted at the top of the sensor so that even if I would like to see appointments of the next 4 days (fetchdays=4/fetchdayspast=0) based on your onePersonNext4.yaml I am only see birtday entries in a mixed order... similar issue were discribed by Ton in the home assistant community forum... However before the last update I was able to see appointments of the next four days so that I assume it is not an ics issue...
Pls. could you recheck update code or do you have any proposals to solve issue.
Thx.
KR
Nils

grafik

Addons can not load

Hello I use new home assistant.
Home Assistant 2022.7.7 Supervisor 2022.07.0 Operating System 8.4 Kezelőfelület 20220707.1 - latest

Error:
Failed to to call /store/repositories - Cmd('git') failed due to: exit code(128) cmdline: git clone -v --recursive --depth=1 --shallow-submodules https://github.com/kdw2060/hassio-addon-calendar /data/addons/git/10a8315b stderr: 'Cloning into '/data/addons/git/10a8315b'... fatal: could not read Username for 'https://github.com': No such device or address '

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.