jobr99 / nspanel-lovelace-ui Goto Github PK
View Code? Open in Web Editor NEWCustom Firmware for NsPanel with the design of HomeAssistant's lovelace UI in mind, works with Tasmota.
License: GNU General Public License v3.0
Custom Firmware for NsPanel with the design of HomeAssistant's lovelace UI in mind, works with Tasmota.
License: GNU General Public License v3.0
Hi, one more issue related to the temp control in the themorstat page. i actually can turn on or turn off or set modes but unable to increase the temp or descrease temp.
Hi There :)
First of all, thanks for the awesome Project, I'm trying it today for the first time as I just got my NSPanel and everything seems to be working flawlessly 👍
One thing however, the update to 1.8.3 has broken the Exit Button for me. As a matter of fact i'm now unable to quit the screensaver or an entity card from touching the screen.
The right Payload is however still be send to the right topic :
{ "CustomRecv": "event,buttonPress2,screensaver,bExit" }
Let me know if you need some logs or smth.
Cheers!
Is there any way to have some options like brightness to be changed on demand?
I think an option like: to turn the brightness to 0 when no one is in the room or at home, would make sense and also be more energy efficient.
Happy to read your thoughts! :)
Greetings from Köln
Hello, can you secure certain switches with a password or do you get a confirmation before you activate it?
After rewrite of the config parsing, logging needs some cleanup
Reduce noise produced in AppDaemon Log
Use different loglevels ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
Remove some wired logging messages that are printing objects
First of all thank you very much for your wonderful work, the ui is part from home assistant and I'm very impressed.
I had the panel flashed a while ago and only since today I could mount it on the wall with a 3d printed adapter (was too big for the box in my old german appartment), so today I flashed everything new.
Suddently touching the panel it doesn't open the cards.
If I reboot the first card pops up, everything works but I can't move to the next one (touching the arrows doesn't do anything).
In tasmota console everytime I touch the screen I got:
MQT: tele/nspanel/RESULT = {"CustomRecv":"event,buttonPress2,screensaver,bExit"}
Tried:
Flashing latest tasmota32.bin
Flashing latest lui.tft from your website (panel starts from 92% and tasmota console doesn't show any received bytes but only percentage done)
Flashing latest berry drive
My appdaemon.yaml:
nspanel-1:
module: nspanel-lovelace-ui
class: NsPanelLovelaceUIManager
config:
panelRecvTopic: "tele/nspanel/RESULT"
panelSendTopic: "cmnd/nspanel/CustomSend"
updateMode: "auto-notify"
timeoutScreensaver: 15
brightnessScreensaver:
- time: "9:00:00"
value: 10
- time: "21:00:00"
value: 0
locale: "de_DE"
timeFormat: "%H:%M"
dateFormatBabel: "EEEE dd/M/y"
weatherEntity: weather.openweathermap
pages:
- type: cardEntities
heading: Licht
items:
- light.gastzimmer_licht_1
- light.gastzimmer_licht_2
- light.gastzimmer_licht_3
- delete
- type: cardThermo
heading: Heizung
item: climate.gastezimmer_thermostat
- type: cardMedia
heading: Musik
item: media_player.mopidy_http_server_on_esprimominipc_2_6680
Thanks for sharing your excellent dashboard!
Flashed it on the NSPanel and it's looking great 👍
I am totally new to NodeRed and have some questions you can hopefully help me with.
"event,screensaverOpen"
but can't find where to change that.externalUpdates
and if I trigger the light via HA it is being updated correctly showed by the little text under the enity, see the screenshot. I noticed that externalUpdates
is not connected to anything. I guess that needs to be connected to pages
?externalUpdates
doesn't seem complete. I don't see anything set to the new value.switch
and added a new call service. Also updated the code in pages
but I am clearly missing something as it doesn't work. Can you point me in the right direction?I succeeded in only showing the colortemp slider when the light supports that, so finding my way in Nodered already a bit 😉
function genDetailPage(type, friendlyName){
var out_msgs = [ ]
let id = searchIdInPages(friendlyName)
if(type == "popupLight"){
let switchVal = "0"
if(global.get("homeassistant.homeAssistant.states['"+id+"'].state") == "on")
switchVal = "1"
let attr = global.get("homeassistant.homeAssistant.states['"+id+"'].attributes")
let brightness = Math.trunc(scale(attr.brightness, 0, 255, 0, 100))
let colortemp = "disable"
let attr_support_color = attr.supported_color_modes
if (attr_support_color.includes("color_temp"))
colortemp = Math.trunc(scale(attr.color_temp, attr.min_mireds, attr.max_mireds, 0, 100))
out_msgs.push({ payload: "entityUpdateDetail,"+switchVal+","+brightness+","+colortemp})
}
return out_msgs
}
I am trying to flash the EU model and I'm getting on screen:
Model does not match
Device Model:
NX4832F035_011C
Is this one just for US models?
Hi,
I did the ns-flash tool for loading custom HMI's to the Tasmota based NSPanels, which you found helpful (I think) to upload your HMI.
I have also done a generic HMI for the NSPanel which you can communicate with over JSON (over MQTT on the Tasmota version).
It, like yours, uses a protocol very similar to that used by the stock HMI. I do not really know much about ESPHome but I would imagine it's very easy to get it to work with ESPHome too. If you are interested, you can have a look here. Might only take you a short time to get ESPHome working with that too. If that was on interest to you;
https://community.openhab.org/t/nxpanel-replacement-firmware-for-sonoff-nspanel/132869
Thanks
I downloaded your ui because i previously tried to do it via esphome which did not work. So i tought lets give tasmota a shot, i have uploaded the tft but it is only showing the page forward and backward keys. Any fix for this?
Messages that end with 55 are throwing an exeption in the berry driver.
for example "event,pageOpen,4"
NSP: Received Raw = bytes('55BB106576656E742C706167654F70656E2C345355')
BRY: Exception> 'index_error' - bytes index out of range
stack traceback:
<unknown source>: in function `event`
Minimal example to reproduce (test1 fails, test2 works):
test1 = bytes('55BB106576656E742C706167654F70656E2C345355')
test2 = bytes('55bb106576656e742c706167654f70656e2c331297')
def split_55(b)
var ret = []
var s = size(b)
var i = s-1 # start from last
while i > 0
if b[i] == 0x55 && b[i+1] == 0xBB
ret.push(b[i..s-1]) # push last msg to list
b = b[(0..i-1)] # write the rest back to b
end
i -= 1
end
ret.push(b)
return ret
end
split_55(test1)
The latest version of the panel firmware uses the new weather-icon styles, so 1 big and 4 small icons.
Is it still possible to show the icons 'the old way', or is that unsupported with the latest firmware?
I'm using V1.7.0 and show more information than just the weather forecast in the screensaver, so for example:
weatherUpdate,?2?19.7 °C?26?46%?Vent.?30?Med.?Energy?4?355W
weatherUpdate,?2?19.7 °C?26?46%?Heating.?28?Low?CO2?24?662
I'm a bit hesitant to update to the latest firmware and take the risk of losing this information.
Hi there,
I am trying to flash my NSPanel with the nspanel.tft supplied in the git repository. The file is uploaded to a local webserver and from the console it shows the following:
07:53:01.119 CMD: flashnextion http://192.168.1.32/uploads/nspanel.tft
07:53:01.140 MQT: stat/nspanel/RESULT = {"FlashNextion":"Done"}
07:53:01.228 connected: true
07:53:01.234 Downloading Byte 0 - 0
07:53:01.366 Content-Range: bytes 0-0/196832
07:53:01.377 NSP: Sent = bytes('4452414B4A485355594447424E434A48474A4B534842444EFFFFFF')
07:53:01.388 NSP: Sent = bytes('7265636D6F643D30FFFFFF')
07:53:01.395 NSP: Sent = bytes('7265636D6F643D30FFFFFF')
07:53:01.401 NSP: Sent = bytes('636F6E6E656374FFFFFF')
07:53:01.406 NSP: Sent = bytes('636F6E6E656374FFFFFF')
07:53:01.421 NSP: Received Raw = bytes('636F6D6F6B20322C33303631342D302C4E5834383332463033355F303131432C...')
07:53:01.430 NSP: Sent = bytes('77686D692D777269203139363833322C3131353230302C31FFFFFF')
07:53:01.520 NSP: Received Raw = bytes('636F6D6F6B20322C33303631342D302C4E5834383332463033355F303131432C...')
07:53:01.530 NSP: Sent = bytes('77686D692D777269203139363833322C3131353230302C31FFFFFF')
07:53:01.919 NSP: Received Raw = bytes('05')
07:53:01.926 rec 0x05
07:53:01.929 current chunk empty
07:53:01.948 connected: true
07:53:01.953 Downloading Byte 0 - 32767
07:53:02.710 Flashing Progress ( 4096 / 196832 ) [ 2 ]
07:53:02.724 MQT: tele/nspanel/RESULT = {"Flashing":{"complete": 2}}
On the NSPanel however it briefly goes to a black flash screen and then changes to a white display with the following:
Model does not match
Device Model:
NX4832F035_011C
(I have the EU version of the panel so not sure if this is why?)
Hi there,
this is a feature request to support HA entities of type binary_sensor. Use case: Display information on window state open/closed.
Thanks a ton,
Florian
Hi there,
first of all: Thanks a ton for this amazing work, exactly what I've been looking for since I ordered my NSPanel!
I'm facing the following issue: When tapping on a RGB lamp, all I'm getting is an empty page with just an on/off toggle, no RGB selector and/or color temperature slider. I'm using a cardEntities page for the lights and not all of them are RGB lights:
- type: cardEntities
heading: Licht
items:
- light.esstischlampe # switch only
- light.fernsehlampe # RGB enabled
- light.sofa # RGB enabled
- light.vitrine # switch only
What am I missing?
Cheers,
Florian
change icon depending on status
hi, i have the us version of the NSpannel, this tft file load but it's not working properly. it's posibe make a US version?
Hi
is it possible to add some sensor info like room Temp, Air quality sensor onto the screensaver ? and it would be great if the switches status can appear on all the pages and screensaver like the original firmware ?
Hi, your work is simply amazing, took a bit more time to install intially but after all were setup, i can easily configure and put what i want
however, i dont know if you have similar issue, but touching on my device is not accurate, i meant that if i press a button, i will have to press a bit far away to the right side from the button position, it happens to all other buttons, all go abit to the right side. i am not sure if i need to do some touch calibration but i didnt have issue with ESPHome.
let me know if it can be resolved ?
I've implemented my own Python backend application to control a NSPanel with Lovelace-UI, but I can't get the popupNotify Page working.
I tried the following commands, but nothing happens:
mosquitto_pub -t 'cmnd/tasmota_XXX/CustomSend' -h mqtt.home -p 1883 -m 'pageType,popupNotify'
mosquitto_pub -t 'cmnd/tasmota_XXX/CustomSend' -h mqtt.home -p 1883 -m 'entityUpdateDetail,|updateBerryNoYes|Driver Update available!|65535|Dismiss|65535|Yes|65535|some text to show|65535|0'
I've created the commands by looking at your Appdaemon application:
https://github.com/joBr99/nspanel-lovelace-ui/blob/main/apps/nspanel-lovelace-ui/nspanel-lovelace-ui.py#L57
https://github.com/joBr99/nspanel-lovelace-ui/blob/main/apps/nspanel-lovelace-ui/nspanel-lovelace-ui.py#L665
Can you help me out here? I expected the display to wake-up and show the message, but nothing happened so far.
(thanks for all your work btw. I really love the project!)
Hi there,
i really like the way, you are dealing with getting content to the NSPanel... i've testes some other implementations with esphome, but find it complicated to get content to the Panel... So i'm currently trying out your project.
But i realized, that tasmota has a delay between triggering the physical button and switching the relay...
So first of all: thanks for your idea :-D
items: [
"switch.esstisch",
"switch.kuchenschrank",
"sensor.rf433_temp_wohnzimmer",
"delete.me"
]
What is the purpose of the newly added appdaemon and how to use it?
is it possible to add script on an entity page ? i really want to run some scripts of playing a certain playlist using a play_media service but unfortunately the scenes cannot call service, but only change state.
Hi,
I followed instructions to flash my NSPanel step by step and everything seems to work, except that the screen on my device remains black after running the "FlashNextion" command. Nothing seems to happen... I have tried various times. Here's what I see in the console log:
11:16:39.943 CMD: FlashNextion http://nspanel.pky.eu/lui.tft
11:16:39.961 MQT: stat/tasmota_poolhouse/RESULT = {"FlashNextion":"Done"}
11:16:40.033 FLH: host: nspanel.pky.eu, port: 80, get: /lui.tft
Simply FYI; the Nextion Flash process isn't robust against bricked/incomplete-flashed displays.
I managed to fix the issue using this library:
https://github.com/peepshow-21/ns-flash/blob/master/berry/nxpanel.be
Error in apps.yaml - in "", line 8, column 29:
Fixed
updateMode: auto-notify # possible values are auto, auto-notify and manual
Hello,
first of all, I really like the implementation you have created. It's really easy to configure and works really great.
I'm still strugling a little bit with the "CustomSend" commands. But I will hopefully find out how to manage them.
For now I have a few questions if this is possible of not.
With kind regards
Bart
Once again thanks for your awsome work! In a future release I'd love to see support for the HA alarm panel. Will this be possible from a technical point of view?
Update im Display angeschoben, aber es passiert nichts weiter.
16:42:01.311 MQT: stat/nspanel/RESULT = {"CustomSend":"Done"}
16:42:11.186 MQT: tele/nspanel/RESULT = {"CustomRecv":"event,buttonPress2,updateDisplayNoYes,notifyAction,yes"}
16:42:11.952 MQT: stat/nspanel/RESULT = {"FlashNextion":"Done"}
16:42:11.966 FLH: host: nspanel.pky.eu, port: 80, get: /lovelace-ui/github/nspanel-v1.8.0.tft
16:42:12.946 HTTP/1.1 404 Not Found
16:42:12.950
16:42:12.952 Date: Sat, 26 Mar 2022 15:42:11 GMT
16:42:12.956
16:42:12.958 Content-Type: text/html; charset=iso-8859-1
16:42:12.962
16:42:12.964 Connection: close
16:42:12.966
16:42:12.970 CF-Cache-Status: DYNAMIC
16:42:12.972
16:42:12.976 Report-To: {"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v3?s=KgI51nj9pYw0UAbM8xwFLqmglAbr5gnkTgnkX8JWtyJXMZ0Vtjyzcepgcl4ykROUst30QRfgwosnebJE9dNa0H3U%2FnMJcEiwsc%2FkVQZQeA6tuItpSpUSKwCMWlKg5oXiWgg60A%3D%3D"}],"group":"cf-nel","max_age":604800}
16:42:12.984
16:42:12.986 NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
16:42:12.990
16:42:12.993 Server: cloudflare
16:42:12.996
16:42:12.998 CF-RAY: 6f20feac0cf17270-HAM
16:42:13.002
16:42:13.004 alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
16:42:13.008
16:42:13.011
16:42:13.014
16:42:13.016
16:42:13.140 FLH: Send (High Speed) flash start
16:42:13.542 BRY: Exception> 'divzero_error' - division by zero
With the recent changes to navigation, state callbacks are causing the display to wake.
To prevent this it's needed to stop sending pageType commands on state change callbacks.
I have set-up 2 panels with nspanel-lovelace-ui (nice work!).
However when I define only 2 pages you can keep pressing (left/right) arrow. After the last page the first one is shown but in the logs the pagenumber keep increasing/decreasing.
Better should be to hide the right/left arrow on the last/first page.
apps.yaml
`nspanel-2:
module: nspanel-lovelace-ui
class: NsPanelLovelaceUIManager
config:
panelRecvTopic: "Smarthome/tele/tasmota_7C0660/RESULT"
panelSendTopic: "Smarthome/cmnd/tasmota_7C0660/CustomSend"
timeoutScreensaver: 15 #in seconds, values between 5 and 60 are allowed
#brightnessScreensaver: 10
brightnessScreensaver:
- time: "7:00:00"
value: 10
- time: "23:00:00"
value: 0
locale: "nl_NL" # only used if babel python package is installed
dateFormatBabel:
"full" # only used if babel python package is installed
# formatting options on https://babel.pocoo.org/en/latest/dates.html?highlight=name%20of%20day#date-fields
timeFormat: "%H:%M"
dateFormat: "%A, %d. %B %Y" # ignored if babel python package is installed
weatherEntity: weather.huis
pages:
- type: cardEntities
heading: Example Page 1
items:
- switch.0x00124b0024c045bf
- switch.fan_badkamer_beneden
- light.hue_phoenix_1
- scene.badkamer_gedimd
- type: cardThermo
heading: Exmaple Thermostat
item: climate.bureau_fre`
log :
`21:10:48.616 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C319356')
21:10:48.635 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,1"}
21:10:49.601 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:49.741 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:51.439 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C32D357')
21:10:51.458 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,2"}
21:10:52.326 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:52.405 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:52.422 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C32D357')
21:10:52.440 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,2"}
21:10:52.566 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:53.039 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:53.112 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:53.214 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:56.445 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C331297')
21:10:56.464 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,3"}
21:10:57.334 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:57.507 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:57.522 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C331297')
21:10:57.536 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,3"}
21:10:57.944 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:58.084 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}
21:10:58.319 NSP: Received Raw = bytes('55BB10006576656E742C706167654F70656E2C345355')
21:10:58.339 MQT: Smarthome/nspanel_7A2EE8/tele/RESULT = {"CustomRecv":"event,pageOpen,4"}
21:10:59.403 MQT: Smarthome/nspanel_7A2EE8/stat/RESULT = {"CustomSend":"Done"}`
Hi I have tried multiple times but the Nspanel progress bar remains at 0%
Any ideas to how I could continue?
My Tasmota Log File:
nspanellog.txt
I am not a developer, I chose your project as node red is something I have worked with and which I feel comfortable using.
Thanks for your support
Guten Morgen,
Vielen Dank für die super Projekt, ich nutze es seit ein paar Tagen und bin begeistert. Ich sende dir einen kleinen Beitrag für die Pizza 👍
Ich habe seit zwei Tagen keine Wetterinformationen mehr auf dem Panel. Heute habe ich von „main“ auf die Version 1.8.3 upgedatet. BEim AppDaemon erscheint im LOG die Meldung:
ERROR nspanel-1: Skipping Weather Update, entitiy not found
In der Config habe ich „weather.home“ eingetragen:
timeFormat: "%H:%M"
dateFormat: "%A, %d. %B %Y" # ignored if babel python package is installed
weatherEntity: weather.home
Kann ich etwas ändern oder einstellen, damit die Wetterinformationen wieder angezeigt werden?
Vielen Dank!
Hi, third issue but i am not sure if it actually is an issue but the time in the screensaver is not accurate, i live in Vietnam so i set locale to be vi_VN but the screen still shows 7-8 hours behind our actual time.
for your info, i installed appdaemon as a docker container and have no idea of how to install a babel package which might be the cause of this issue
appreciate if you could help.
First of all thank you, I just sent you a little something to buy you some coffees ;)
Would it be possible to define the icons or the type of entity and deduce the corresponding icon on the "cardGrid" card?
The "cardGrid" are really useful to navigate with many pages.
Would it be possible to modify the function of the arrows?
Ideally, I will see a cardGrid welcome screen, redirecting to other cardGrids with a possibility of returning to the previous cardGrid, without waiting for standby, or without adding an item for that?
I would see an optional configuration in the sytle:
- type: xxx
heading: xxx
items:
-xxx
-xxx
-xxx
-xxx
parent_page: navigate.xxx.yyy
next_page:navigate.xxx.yyy
Last thing, would it be possible to add a scroll for the value of certain sensors? For example for text sensors?
Thanks.
Hi,
I have to update manually Display Driver and Berry Driver after each HACS update.
In debug mode, I see:
2022-03-29 09:18:37.290850 DEBUG nspanel-1: call_service: mqtt/publish, {'topic': 'cmnd/NsPanel_7DEE08/GetDriverVersion', 'payload': 'x'}
(...)
2022-03-29 09:18:43.720988 DEBUG nspanel-1: MQTT callback for: {'topic': 'tele/NsPanel_7DEE08/RESULT', 'wildcard': None, 'payload': '{"CustomRecv":"event,startup,20"}'}
2022-03-29 09:18:43.744499 INFO nspanel-1: Received Message from Screen: event,startup,20
2022-03-29 09:18:43.773656 INFO nspanel-1: Update Pre-Check failed Tasmota Driver Version: None Panel Version: 20
What can I do to resolve it?
Could this HMI ported to ESPHOME instead of TASMOTA ?
Hi, just updated to newest version of 1.8.3 and have small issue with the player page, i can control the spotify to volume up or down and change to next song but the song name is not updated respectively, i will have to change to next page and then go back to the spotify page to see the song name updated.
similarly, the mode state in Thermostat page also is not updated until you move out and move back to this page.
i guess, these info only updated after refreshing the page to pull updated info.
by the way, is there anyway to play spotify on specific speaker or spotify connect device ? or you can code to show a source selector on the spotify page ?
Hi there,
another feature request from my end: Can we get name overrides similar to icon overrides? There are multiple use cases for this:
As usual: Thank you for considering!
Cheers,
Florian
I do have a home ventilation system with 4 states: Off (0), 1, 2, 3.
To control it I have an esphome esp32 with the config as "number" entity (
`number:
platform: template
name: "Lueftungsanlage"
id: lueftung
step: 1
min_value: 0
max_value: 3
initial_value: 1
optimistic: true
on_value:[...]`
Can I somehow display it on the nspanel as slider or like a cover control with the number of the current state in the middle?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.