jziolkowski / tdm Goto Github PK
View Code? Open in Web Editor NEWGUI application to discover and monitor devices flashed with https://github.com/arendst/tasmota
License: GNU General Public License v3.0
GUI application to discover and monitor devices flashed with https://github.com/arendst/tasmota
License: GNU General Public License v3.0
windows string to install is missing the "PyQt5" at the end :
now it says
C:<full path to python3 folder>\python.exe -m pip install
it should say
C:<full path to python3 folder>\python.exe -m pip install PyQt5
ALSO
there is no mention about a need of mqtt-paho module being installed - probably worth mentioning it because without it pythonw.exe tdm.py will not run and will give no msg, only python.exe tdm.py would give a hint
thanks!
Hi,
Thanks for your tool and the sharing.
I have a problem with a Sonoff 4ch pro r2 module and Tasmota 6.5.0 firmware. When I launch TDM, the 4 relays appear :
But when I activate one, the icon displayed changes and shows only 1 dot (green or red according the state of the relay acted). But I can change the state of the 4 relay and the dot shows only the state of the first relay acted (for instance the 4th relay if I changed it first).
If I quit the module line, I can only act on the same relay : impossible to chose belong the 4 relays :
Regards,
Thierry
C:\Python38-32\python.exe tdm.py
DISCOVERED X12
Traceback (most recent call last):
File "C:\Users\konst\tdm\Util\models.py", line 92, in data
if val.startswith("0T"):
AttributeError: 'int' object has no attribute 'startswith'
The error is similar to #10. Discovered device X12 has Sonoff-Tasmota version 6.6.0.18 (Basic Module with BMP280 sensor).
Instead of creating preferences in ~/TDM/ and polluting the users home directory, it would be preferable to store it in a config location such as the commonly used ~/.config/
From the Configure menu, when I switch to the "Rules and Timers" tab tdm crashes and I get the following error:
Traceback (most recent call last):
File "<full file path removed>tdm/GUI/DeviceConfig.py", line 155, in mqtt_message
self.parseTimer(msg[first])
File "<full file path removed>/tdm/GUI/DeviceConfig.py", line 371, in parseTimer
self.cbxTimerOut.setCurrentIndex(payload['Output']-1)
KeyError: 'Output'
Aborted
I have no rules or timers setup, so perhaps that would be the reason?
Hi, i could not get any device from my IOBROKER. After some trys i ot this when i try to start tdm:
PS C:\ESP\tdm-master> python.exe .\tdm.py
Traceback (most recent call last):
File ".\tdm.py", line 236, in mqtt_connected
self.mqtt_subscribe()
File ".\tdm.py", line 248, in mqtt_subscribe
main_topics.append(self.device_model.commandTopic(idx))
File "C:\ESP\tdm-master\Util\models.py", line 221, in commandTopic
return self._devices[row][DevMdl.FULL_TOPIC].replace("%prefix%", "cmnd").replace("%topic%", self._devices[row][DevMdl.TOPIC])
AttributeError: 'NoneType' object has no attribute 'replace'
Working on it :)
I tried for the first time tdm-0.2
I only specified my broker IP and connected
It discovered one of my tasmota and exited with this log
PS D:\Programmi\tasmota-device-manager-0.2> python tdm.py
DISCOVERED h801
Traceback (most recent call last):
File "D:\Programmi\tasmota-device-manager-0.2\Util\models.py", line 104, in data
return d.color()
File "D:\Programmi\tasmota-device-manager-0.2\Util\__init__.py", line 295, in color
68: self.setoption(68)
File "D:\Programmi\tasmota-device-manager-0.2\Util\__init__.py", line 310, in setoption
options = int(so[reg], 16)
IndexError: list index out of range
I managed to bypass this really dirty code editing, knowing nothing of what so, reg and o are in the code
so = self.p.get('SetOption')
if so:
if reg in (0, 2):
if len(so) <= reg: # this one
return -1 # this other one
options = int(so[reg], 16) # this is 0.2 version original line 310
if reg == 2:
o -= 50
state = int(options >> o & 1)
hope this helps somehow (some exception handling will surely do, as well :-) )
...briefly looking at the current developement code my understanting is that the same problem can happen with it, also
so = self.p.get('SetOption')
if so:
if reg in (0, 2, 3):
options = int(so[reg], 16)
if reg > 1:
o -= 50
state = int(options >> o & 1)
When a right click is done on a device it shows this menu
Would be nice if there was an Upgrade using OTAurl
option which would send a command upgrade 1
to the device causing it to start an OTA upgrade from the otaurl which was previously configured.
It may also be useful to have a button on the top bar so that multiple devices can be selected and by clicking Upgrade OTAurl
it would result in all the selected devices receiving the upgrade 1
command.
Thanks
When right click on device list (empty one) the app crash with the following message
Traceback (most recent call last):
File "D:\ESP8266\Tasmota Device Manager\GUI\Devices.py", line 312, in show_list_ctx_menu
self.select_device(self.device_list.indexAt(at))
File "D:\ESP8266\Tasmota Device Manager\GUI\Devices.py", line 317, in select_device
self.device = self.model.deviceAtRow(self.idx.row())
File "D:\ESP8266\Tasmota Device Manager\Util\models.py", line 30, in deviceAtRow
return self.tasmota_env.devices[row]
IndexError: list index out of range
Very nice project and I have different prefixes. Where to change this in the code?
Hi, thanks for your great app to manage Tasmota devices. I am just digging in to find all things great, but I was primarily looking for a way to remotely backup the configuration of my Tasmota devices. Imho, there are at least two good reasons to facilitate it:
Just my 2 cents ;). For now, thanks a lot!
In the console - in the line where you key in a command (type the command and press ENTER to send) - unless I'm missing somethin there is no memory of past commands - so if for example you are messing with colours or something else that might take a few attempts, up arrow does not take you back up to previous lines.... any chance??
Pete
Selecting a device and clicking right mouse pops up a menu.
Pls add option WebUi to it so I do not have to select the device and move the mouse all the way over to the top right option WebUI ;-)
please consider adding docker. Thank you
Is there a way to tun this project into a web accessible site? I want to run this on a headless PI and can't at this point...Unless I'm missing something
Just an/optional enhancement for the read.me.
At start I couldn't get the GUI active due to (let's assume) ignorance.
To have this wonderful code running on my Ubuntu 16.04 standard python intallation, I had to
So, no problem with the code but merely the execution which does not succeed (with me), running standard python 2.7, I had to use python 3.5.2 (standard ubuntu base install)
TDM - very recent - just installed a few days ago... looking at my Sonoffs and other devices... lovely but...
It says that heating-cupboard-light (a sonoff) has been on for 539 days - WRONG - the cupboard didnt exist that long ago - and last December we had a new heating sytem installed, whole house power was off while that was happening. That light is using Sonoff-Tasmota 6.4.1 - well, it was until 5 minutes ago, then Iused OTA and it went up to 7.0.0.1 (completely automatically) - 5 minutes later I tried again and it went to 7.0.0.3 - this time I had to refresh the browser but it's working - stioll in light theme though.... I'm getting sidetracked, the MAIN issue is that erronious number of days.. I suess with it being old, not much we can do about it as long as the new version doesnt do the same - so instead, how do I fix that light theme?
Python 3.7 on Windows 10.
After configuring MQTT host, some Sonoff devices found then program crashes.
Program now opens, then crashes after a couple of seconds.
Console:
D:\python\tdm>python tdm.py
Traceback (most recent call last):
File "tdm.py", line 337, in mqtt_message
self.device_model.updateValue(found.index, DevMdl.RESTART_REASON, payload['RestartReason'])
KeyError: 'RestartReason'
I'm unable to connect to my MQTT broker (builtin HomeAssistant). TDM just says Connecting to broker, and after a few seconds Disconnected. Is there any debug switch I can enable?
Hi,
Got tdm working; it's connecting to my mosquitto server. Tried to add a device manually as no device was detected automatically. Clicked 'Configure' to change '%topic%/%prefix%/' into '%prefix%/%topic%/' but while saving tdm crashed. Tried to start it again but it's giving me the error:
Traceback (most recent call last):
File "tdm.py", line 236, in mqtt_connected
self.mqtt_subscribe()
File "tdm.py", line 248, in mqtt_subscribe
main_topics.append(self.device_model.commandTopic(idx))
File "D:\PlatformIO\Projects\HOMEAUT_folder\tdm\Util\models.py", line 221, in commandTopic
return self._devices[row][DevMdl.FULL_TOPIC].replace("%prefix%", "cmnd").replace("%topic%", self._devices[row][DevMdl.TOPIC])
AttributeError: 'NoneType' object has no attribute 'replace'
and is crashing after displaying the main screen for a few seconds.
How to solve this?
I setup the Broker information correctly and it connects successfully. Telemetry data is received from several devices, but when I select one and select Configure it creates a new tab for the device - says Connecting - and crashes with error. I have not configured admin credentials on my devices.
Traceback (most recent call last): File "C:\users\jymorris\Google Drive\Property and Landlording\Home Automation\tdm-master\GUI\DeviceConfig.py", line 105, in setupMqtt self.mqtt.setAuth(self.settings.value('username'), self.settings.value('password')) AttributeError: 'MqttClient' object has no attribute 'setAuth'
Both actions send the power command with "true" or "false" as payload, but it should be 1 or 0 (or "on" or "off").
I fixed it for myself by changing "toggle_power_all" in Devices.py from
self.mqtt.publish(self.device.cmnd_topic(r), str(not bool(idx)))
to
self.mqtt.publish(self.device.cmnd_topic(r), idx ^ 1)
Hi,
I just found this nice program, but can't it work. I have one PowR2, I added manually, but details are not shown. In console is this error shown:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib64/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 2650, in _thread_main
self.loop_forever(retry_first_connection=True)
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 1481, in loop_forever
rc = self.loop(timeout, max_packets)
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 1003, in loop
rc = self.loop_read(max_packets)
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 1284, in loop_read
rc = self._packet_read()
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 1849, in _packet_read
rc = self._packet_handle()
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 2305, in _packet_handle
return self._handle_publish()
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 2500, in _handle_publish
self._handle_on_message(message)
File "/home/marian/.local/lib64/python3.6/site-packages/paho/mqtt/client.py", line 2647, in _handle_on_message
self.on_message(self, self._userdata, message)
File "/home/marian/programy/tdm/Util/mqtt.py", line 144, in on_message
mstr = msg.payload.decode("ascii")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)
The mqtt messages (generated when I click on mqtt button)
cmnd/PowR2/status (null)
cmnd/PowR2/status 1
cmnd/PowR2/status 2
cmnd/PowR2/status 3
cmnd/PowR2/status 5
cmnd/PowR2/status 8
cmnd/PowR2/status 11
stat/PowR2/STATUS {"Status":{"Module":43,"FriendlyName":["Sonoff POW R2"],"Topic":"PowR2","ButtonTopic":"0","Power":0,"PowerOnState":3,"LedState":1,"SaveData":1,"SaveState":1,"SwitchTopic":"0","SwitchMode":[0,0,0,0,0,0,0,0],"ButtonRetain":0,"SwitchRetain":0,"SensorRetain":0,"PowerRetain":0}}
stat/PowR2/STATUS1 {"StatusPRM":{"Baudrate":4800,"GroupTopic":"sonoffs","OtaUrl":"http://thehackbox.org/tasmota/release/sonoff-CZ.bin","RestartReason":"Power on","Uptime":"34T04:29:36","StartupUTC":"2019-01-20T09:13:16","Sleep":0,"BootCount":18,"SaveCount":202,"SaveAddress":"FA000"}}
stat/PowR2/STATUS2 {"StatusFWR":{"Version":"6.3.0","BuildDateTime":"2018-10-30T17:38:46","Boot":6,"Core":"2_3_0","SDK":"1.5.3(aec24ac9)"}}
stat/PowR2/STATUS3 {"StatusLOG":{"SerialLog":2,"WebLog":2,"SysLog":0,"LogHost":"","LogPort":514,"SSId":["my_ssid",""],"TelePeriod":300,"SetOption":["000A8009","55818000","00000000"]}}
stat/PowR2/STATUS5 {"StatusNET":{"Hostname":"Sonoff_PowR2","IPAddress":"192.168.1.70","Gateway":"192.168.1.1","Subnetmask":"255.255.255.0","DNSServer":"192.168.1.1","Mac":"80:xx:xx:xx:xx:xx","Webserver":2,"WifiConfig":5}}
stat/PowR2/STATUS8 {"StatusSNS":{"Time":"2019-02-23T14:42:53","ENERGY":{"TotalStartTime":"2018-10-31T20:32:18","Total":12.163,"Yesterday":0.000,"Today":0.000,"Power":0,"ApparentPower":0,"ReactivePower":0,"Factor":0.00,"Voltage":0,"Current":0.000}}}
stat/PowR2/STATUS11 {"StatusSTS":{"Time":"2019-02-23T14:42:53","Uptime":"34T04:29:37","Vcc":3.219,"POWER":"OFF","Wifi":{"AP":1,"SSId":"my_ssid","BSSId":"BC:xx:xx:xx:xx:xx","Channel":8,"RSSI":76}}}
I'm on Gentoo linux, python 3.6.5, paho-mqt 1.3.1.
Any idea? Could this been caused by Czech FW?
Hi, it looks like the firmware does not like it if request comming in too fast. I do see a reboot with an exception on many devices. Is it possible to insert some delay between the request? Honestly, some devices do not reboot and I have no idea why. I do not see a pattern.
As a continuation of our discord chat I would like to open an issue to keep track of the situation.
I'm still missing consistenly devices from the TDM device list. After I first missed a POW I now also miss another device. Both devices seem to be accessable by TDM as they both show this after a restart:
00:00:00 CFG: Loaded from flash at F9, Count 3625
00:00:00 Project tasmota Pow1 Logeerkamer Version 7.0.0.5(tasmota)-2_6_1
00:00:04 WIF: Connecting to AP1 indebuurt3 in mode 11N as pow1...
00:00:05 WIF: Connected
00:00:05 HTP: Web server active on pow1 with IP address 192.168.2.151
09:26:30 MQT: Attempting connection...
09:26:30 MQT: Connected
09:26:30 MQT: tele/pow1/LWT = Online (retained)
09:26:30 MQT: cmnd/pow1/POWER =
09:26:30 MQT: tele/pow1/INFO1 = {"Module":"Sonoff Pow","Version":"7.0.0.5(tasmota)","FallbackTopic":"cmnd/DVES_20DCDC_fb/","GroupTopic":"cmnd/sonoffs/"}
09:26:30 MQT: tele/pow1/INFO2 = {"WebServerMode":"Admin","Hostname":"pow1","IPAddress":"192.168.2.151"}
09:26:30 MQT: tele/pow1/INFO3 = {"RestartReason":"Software/System restart"}
09:26:30 MQT: stat/pow1/POWER1 = {"POWER1":"ON"}
09:26:30 MQT: stat/pow1/POWER1 = ON
09:26:30 MQT: stat/pow1/FULLTOPIC = {"FullTopic":"%prefix%/%topic%/"}
or
00:00:00 CFG: Loaded from flash at FA, Count 5600
00:00:00 Project tasmota Wkaku8 Slaapkamer BBus Version 7.0.0.5(tasmota)-2_6_1
00:00:04 WIF: Connecting to AP2 indebuurt3 in mode 11N as wkaku8...
00:00:05 WIF: Connected
00:00:05 HTP: Web server active on wkaku8 with IP address 192.168.2.210
09:14:01 MQT: Attempting connection...
09:14:01 MQT: Connected
09:14:01 MQT: tele/wkaku8/LWT = Online (retained)
09:14:01 MQT: cmnd/wkaku8/POWER =
09:14:01 MQT: tele/wkaku8/INFO1 = {"Module":"Sonoff Basic","Version":"7.0.0.5(tasmota)","FallbackTopic":"cmnd/DVES_8875AD_fb/","GroupTopic":"cmnd/brievenbus/"}
09:14:01 MQT: tele/wkaku8/INFO2 = {"WebServerMode":"Admin","Hostname":"wkaku8","IPAddress":"192.168.2.210"}
09:14:01 MQT: tele/wkaku8/INFO3 = {"RestartReason":"Software/System restart"}
09:14:01 MQT: stat/wkaku8/POWER1 = {"POWER1":"OFF"}
09:14:01 MQT: stat/wkaku8/POWER1 = OFF
09:14:01 MQT: stat/wkaku8/FULLTOPIC = {"FullTopic":"%prefix%/%topic%/"}
09:14:02 MQT: domoticz/in = {"idx":133,"nvalue":0,"svalue":"","Battery":100,"RSSI":5}
09:14:05 MQT: tele/wkaku8/STATE = {"Time":"2019-11-20T09:14:05","Uptime":"0T00:00:13","UptimeSec":13,"Heap":30,"SleepMode":"Dynamic","Sleep":0,"LoadAvg":68,"MqttCount":1,"POWER1":"OFF","Wifi":{"AP":2,"SSId":"indebuurt3","BSSId":"60:E3:27:58:77:E6","Channel":12,"RSSI":52,"LinkCount":1,"Downtime":"0T00:00:07"}}
09:16:51 MQT: stat/wkaku8/FULLTOPIC = {"FullTopic":"%prefix%/%topic%/"}
The fulltopic probe comes from TDM I suppose as they are normally not there. After this no other TDM requests are received other than once in a while the fulltopic request.
30 other devices are detected just fine.
Any suggestion?
Excellent utility..
It will helpful if we can export data for ALL devices (text or csv) including 'full topic' etc.
In GUI, if IPs are made url link to device, it will easy tp get to consule (to change rule etcs)
I just grabbed the latest TDM (I'm on Windows 10 64 bit) - I don't know if this is new but on powering up TDM (after waiting a few minutes) it does not seem to know the on-off status of most of my Sonoff devices... and on right-clicking in the devices list to bring up the WebUI for a device, where most seem fine, at least one of them comes back with "This site cannot be reached" even though keyng its name into a browser pulls up the web ui no problem. http://my-bed-heater.broadband/
Traceback (most recent call last):
File "C:\tasmota\tdm-master\tdm.py", line 287, in mqtt_message
full_topic = loads(msg).get('FullTopic')
File "C:\Users\alexg\AppData\Local\Programs\Python\Python36-32\lib\json_init_.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\alexg\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 342, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 2 (char 1)
would anyone know how to install this on a mac? i was able to install python 3.7, PyQt5, paho-mqtt, but get this error when trying to execute tdm.py....
$ cd '/Documents/home assistant/tdm-master/' && '/usr/bin/pythonw' '/Documents/home assistant/tdm-master/tdm.py' && echo Exit status: $? && exit 1
Traceback (most recent call last):
File "/Documents/home assistant/tdm-master/tdm.py", line 3, in
from json import loads, JSONDecodeError
ImportError: cannot import name JSONDecodeError
MacBook-Pro:tdm-master$
thanks for any help
It's the first time I am using phython tools with GUI.
Would be great if you can add a hint/link how to start using TDM.
Thanks!
Followed the instructions but tool is not starting up on mac.
had an error come up after i ran the script a few times. windows 10 from command line now i cant get it to run at all. i did modify the firmware of a couple devices. not sure if thats related.
Traceback (most recent call last): File "tdm.py", line 284, in mqtt_message payload = loads(msg)['StatusPRM'] File "C:\Users\nekey\AppData\Local\Programs\Python\Python37\lib\json__init__.py", line 348, in loads return _default_decoder.decode(s) File "C:\Users\nekey\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Users\nekey\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 353, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Invalid control character at: line 1 column 113 (char 112)
Hi,
System: Win64, Python 3.7
I was able to run tdm and connect to my Broker. One device were visible. I thought this is because I have to configure a pattern. My toppics are all in the same Style stadtweg/og/light1. So I have entered a pattern %prefix%/stadtweg/ Because I don't know what prefix should be used. maybe tele ? Since I did that TDM crashes after Start while connecting Broker. Window just closes, no Errormessage. Where can I find the Settings to make the pattern undone? What would be the right pattern in my case?
Hello
I thought it was gonna be simpler to connect to my broker, but it seems that the current config does not work. With the same parameters (IP, port, user and pw) I´m able to connect from another MQTT client, no problems.
Is there a special condition or another parameter that needs to be touched?
Entering a rule with backlog
in the command part is not working since tasmote doesn't support nested backlogs. TDM uses a backlog command to send the rule plus it's settings. Please change this (separate rule transmission and rule settings).
Example rule set:
on System#Boot do
backlog MP3Volume 75;MP3Track 1
endon
on Wifi#Connected do
MP3Track 2
endon
on Wifi#Disconnected do
MP3Track 3
endon
on Mqtt#Connected do
MP3Track 4
endon
on Mqtt#Disconnected do
MP3Track 5
endon
Is it easy to change the Auto Discovery protocol (%topic%/%prefix%/)" path?
I need something in front of the auto discovery protocol /vk/%topic%/%prefix%/
Tried editing various files but no luck yet.
While poking around and figuring TDM out, I opened the BSSid window and clicked "Add", noticed a cell was created, selected it and pressed delete and python crashed with this error:
Traceback (most recent call last): File "C:\users\jymorris\Google Drive\Property and Landlording\Home Automation\tdm-master\GUI\BSSID.py", line 60, in delete key = self.tw.item(self.idx.row(), 0).text() AttributeError: 'NoneType' object has no attribute 'text'
It was reproducible so submitting here.
Hi, I have all the support programs install but get the following error when trying to start tdm.py.
Have not be able to get around this.
`pi@RDP-Heating:~/TDM $ python3.4 tdm.py
Traceback (most recent call last):
File "tdm.py", line 9, in
from GUI import *
File "/home/pi/TDM/GUI/init.py", line 7, in
from Util import DevMdl, CnsMdl
File "/home/pi/TDM/Util/init.py", line 4, in
DevMdl = IntEnum('DevMdl', ["LWT", "TOPIC", "FULL_TOPIC", "FRIENDLY_NAME", "MODULE", "FIRMWARE", "CORE", "MAC", "IP", "SSID", "BSSID", "CHANNEL", "RSSI", "LINKCOUNT", "DOWNTIME", "UPTIME", "RESTART_REASON", "POWER", "LOADAVG", "TELEPERIOD", "MODULE_ID", "OTA_URL"], start=0)
TypeError: call() got an unexpected keyword argument 'start'
`
Can you help me with this? Thanks
This is consistent (for me). When I connect to mqtt host select a tasmota device and click telemetry it works fine. if I close the telemetry window and try to open it again, same or different device, it crashes with this error:
Traceback (most recent call last):
File "/home/ottvio/venvs/tdm/tdm/GUI/Telemetry.py", line 85, in update_telemetry
time_item.setText(1, time.replace("T", " "))
AttributeError: 'NoneType' object has no attribute 'replace'
Aborted (core dumped)
edit add ver.
python3 --version
Python 3.6.8
Please add socks 5 or http proxy support!
Hi, I am having issues with connecting to mqtt.
whenever I try tosetup MQTT broker (Menu MQTT-Broker) the tdm crashes with the following message:
Traceback (most recent call last): File "C:\xxxx\TDM\GUI\Broker.py", line 68, in accept self.settings.setValue("client_id", self.clientId.text()) RuntimeError: wrapped C/C++ object of type QLineEdit has been deleted
can you please help?
Not so much an issue as a feature request of a plea for help depending how it goes... hen watching TDM - its a handy way to see all your devices and update them. If next to the name ethey had the Tasmota version number (ie 7.0.0.5) that would make life a lot easier.
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.