@muppet3000 The config setting is here : https://github.com/johanmeijer/grott/blob/0d1e6878b6d0bd228e4ff3d351fd92c6c389d320/examples/grott.ini#L32
You can check this in the json message it the buffered key is == "yes". The logger fire historical information from when it was cut. This was some time ago some and it isn't super fresh in my memory, but when there was a problem with growatt/grott server it was like 1 day old value and at 10 minute interval. Didn't test with a longer cut, it wasn't my system.
I don't forward this information because it seems HA prefers instantaneous data. I couldn't find a way to backfill data with a pure MQTT device. If you know how to do this, I will be genuinely interested.

I couldn’t see this mentioned anywhere but if you have an account that is locked out you can either log into the web portal and add a new account or use the password reset function.
I’m going down the route of replacing the firmware on my ShineWifi-S stick as that seems that long term it’s the least likely to break.

I couldn’t see this mentioned anywhere but if you have an account that is locked out you can either log into the web portal and add a new account or use the password reset function.
I’m going down the route of replacing the firmware on my ShineWifi-S stick as that seems that long term it’s the least likely to break.

Yep or go with a wemos mini or esp32 and use both in parallel

I decided to flash my SHINE-S after a argument with GROWATT.
I created a detailed tutorial on my repo how to do it with ESPHome in homeassistant.
updates ever 5 seconds, and also MQTT included.

I spent about 5 hours yesterday trying to get exports from the serial and usb interfaces. In my case I already have a ShineWifi  serial connected via serial that powers HASS and I didnt want to lose that.
I was trying to connect my ESP via  USB and it seems massively untested/just didn’t work for me. So I’m going with serial.
@malosaa have you got a link?

I spent about 5 hours yesterday trying to get exports from the serial and usb interfaces. In my case I already have a ShineWifi serial connected via serial that powers HASS and I didnt want to lose that.
I was trying to connect my ESP via USB and it seems massively untested/just didn’t work for me. So I’m going with serial.
@malosaa have you got a link?

https://github.com/malosaa/Growatt_Shine-S_HASS_Mod
I got it working, but be sure your GND is also in GPIO1 connected.
I just used an extra metal pin connected to the GND

@Saentist The datalogger stores the values when there's a problem. When the connection is re established (growatt server up again or grott restarted), it will start to send the missing data to growatt server. (had to manage this problem with grott sending old data to HA)

@egguy Totally incorrect, ShineWIFI datalogger do not store noting
except it own setting how to connect to WiFi network etc.
_____________ABSOLUTELY NOT STORE ANY INVERTER DATA __________
It just transfer scheduled data to cloud, if no internet connection,
then cloud will receive stored to inverter data aka only production daily/total.
No voltage, amperage wattage AC/DC temp etc. send to cloud.
I'm not tested what will happens if more then 48h no connection,
will it transfer SUM of daily production or just last day.

The inverter does store data, atleast for me.
When i did flash my shine-S the data is still there and available.
Total produced and total today produced.

Ok, so it seems I misinterpreted the grott data.
This is the sort of data I was receiving while developing the plugin, It was received from a Shine S, I don't know if it's specific :
	 - MQTT jsonmsg:
			 {"device": "xxxx", "time": "2022-02-20T10:55:12",

"buffered": "yes",

			 "values": {"datalogserial": "xxxxx", "pvserial": "xxxx",
			 "pvstatus": 1, "pvpowerin": 5167, "pv1voltage": 2599, "pv1current": 10,
			 "pv1watt": 2599, "pv2voltage": 2296, "pv2current": 10, "pv2watt": 2296,
			 "pvpowerout": 5090, "pvfrequentie": 5002, "pvgridvoltage": 2336,
			 "pvgridcurrent": 9, "pvgridpower": 2102, "pvgridvoltage2": 2358,
			 "pvgridcurrent2": 8, "pvgridpower2": 1886, "pvgridvoltage3": 2360,
			 "pvgridcurrent3": 9, "pvgridpower3": 2124, "totworktime": 3981384,
			 "eactoday": 4, "pvenergytoday": 4, "eactotal": 2222, "epvtotal": 2156,
			 "epv1today": 2, "epv1total": 1494, "epv2today": 1, "epv2total": 662,
			 "pvtemperature": 602, "pvipmtemperature": 327, "pvboosttemp": 320,
			 "bat_dsp": 0, "eacharge_today": 9, "eacharge_total": 1966080, "batterytype":
			 0, "uwsysworkmode": 0, "systemfaultword0": 0, "systemfaultword1": 0,
			 "systemfaultword2": 0, "systemfaultword3": 0, "systemfaultword4": 0,
			 "systemfaultword5": 0, "systemfaultword6": 0, "systemfaultword7": 0,
			 "pdischarge1": 0, "p1charge1": 0, "vbat": 0, "SOC": 0, "pactouserr": 0,
			 "pactousertot": 0, "pactogridr": 0, "pactogridtot": 0, "plocaloadr": 0,
			 "plocaloadtot": 0, "spdspstatus": 0, "spbusvolt": 0, "etouser_tod": 0,
			 "etouser_tot": 0, "etogrid_tod": 0, "etogrid_tot": 0, "edischarge1_tod": 0,
			 "edischarge1_tot": 0, "eharge1_tod": 0, "eharge1_tot": 0, "elocalload_tod":
			 0, "elocalload_tot": 36391350}}

The inverter does store data, at least for me. When i did flash my shine-S the data is still there and available.
Total produced and total today produced.

This is inverter "live time data" not "production live data".
So in inverter are stored only
Total production kWh and
Total after Factory reset
/on inverter screen only, guessing "Total production kWh" minus "Total production kWh on reset moment"/
Daily Production kWh are live calculated in memory, (see upper comment)
not in storage and on midnight disappears.
Same as all other collected data array disappears after send to cloud.
The datalogger stores nothing, that's reality.

Total production kWh and day data/live production is kept in the inverter.
One time my shine-S broke and needed to buy a new one, but when it had established connection to growatt all missing data in that couple of days where added on the growatt server..

Again Inverter not Logger.
Little but important difference.

@Saentist The datalogger stores the values when there's a problem. When the connection is re established (growatt server up again or grott restarted), it will start to send the missing data to growatt server. (had to manage this problem with grott sending old data to HA)

@egguy - This is really interesting - I've never seen this happen before - I'll need to try and remember this and test for it by taking grott offline. Does the datalogger just fire all of the information at grott when it's back online? Just curious - how did you handle this? Did you check the date of the entries being sent to grott and then only use them if they were within the last X minutes?

It only happens rarely but is a very old feature of the shinewifi stick to resend missing data later.
It can happen due to a weak wifi at home or broken wifi connection for some hours. But it does not happen always.
You can recognie it easily in the hourly graph on the growatt.com dashboard cause if that becomes a kind of straight line or a somewhat arteficial curve that looks like someone had drawn that then those are the spots where data had been missing. In these cases the missing data today can be updated somehow over night and will appear the next day right.
Bigget question: are the daily kWh figures right before that update ?
Yes, it seems that this value is measured by the inverter and will always be transmitted. So if you find a break of 2 hours over noon while the inverter was running full speed with 4,6 kW the next time the shinewifi will get a connection you will get the right kWh figure for today. It is not based on a server based calculation of all the previous Watt figures over time (Rieman Integral) but on your inverters measurement.
I had not recogniced that really or the dimension how often it could happen till we expanded from a 1 inverter system to a 5 growatt inverter system with each of them 4,6 kW , but different ones: 4x Min 4600 and 1x SPH 4600 for using a 48V DIY LFP battery with 8,2 kWh.
I am currently running only a python script to get the data from the growatt server from time to time to compare that with the forecast I had gotten for the day to avoid any blocking. I also get the data from the bresser weatherstation which was a cheap aldi purchase 4 weeks after the first offer, when they put the red sticker down to 59€ for a 7 channel weather station. That sends the data every 10 or 20 secondsd to the weatherground site and from there I pick the Solar Power value  Watt / sqm for comparison. So the production forecast from solcast and solarprognose.de together with the weatherstation report end up with the solar power output of 5 growatt inverters, which means 1 account and I guess 5 api interactions while also the 5 inverters report every minute back their current production.
Therefore I am quite carefull to get not banned and hope to get the grott integration soon.
My biggest question is if the final grott and HA integration will be able to build organisational structure like 3 inverters as one unit for the house supply and 2 as feed in grid inverter plant so that I would get 2 graphs out of our 5 inverters  with 1 hybrid among of them.
And if I will need an e-ink solution of those key figures too - powered by HA or by a simple export file.
Thanks a lot for all your effforts invested into the growatt darkness.

Even Cloud do not have all data.
Lot of gaps, with inverter memory not send ;)

Hi Everyone!
It's been a while, but I've finally done it.
I've just finished the last bit of documentation on the Grott Integration.
For those of you that want to try it out and be the first people to get hands-on with it, here it is: https://github.com/muppet3000/homeassistant-grott
Please take the time to read through the setup guide etc. I spent a lot of time putting it together so I'd like to know if there are any issues people encounter.
There's already an open issue here: https://github.com/muppet3000/homeassistant-grott/issues/1 which people can use to give feedback/corrections on the setup process.
Go gentle on me, there are bound to be some issues with it!

Hi Everyone!
Please take the time to read through the setup guide etc. I spent a lot of time putting it together so I'd like to know if there are any issues people encounter.

I will do once my ihost from sonoff has arrived to start from scratch cause I am adding a dedicated power management HA installation there that does only power related automation stuff like sur plus power charging of the car via wallbox and sur plus for heatpump / heating and consumption measuring. So I will have 5 growatt inverters organised in 2 different setups , 2x 4,6 kW as full feeder while the other 3 are sur plus grid feeder where 1 is a SPH4600 hybrid with diy 8 kWh battery. So in total 4x Min 4600 and 1 SPH 4600 with 2 different energy counters and a lot to track.
I will start slowly cause I have a lot to deal with like 5 WiFi S sticks that I have just upgraded.
But for now I will start reading the documentation to get it right once the ihost has arrived where HA should be running in docker so far cause I have no choise to run hassio on that plattform if I am right.
thanks for all the efforts.

Hi Everyone!
Please take the time to read through the setup guide etc. I spent a lot of time putting it together so I'd like to know if there are any issues people encounter.

I will do once my ihost from sonoff has arrived to start from scratch cause I am adding a dedicated power management HA installation there that does only power related automation stuff like sur plus power charging of the car via wallbox and sur plus for heatpump / heating and consumption measuring. So I will have 5 growatt inverters organised in 2 different setups , 2x 4,6 kW as full feeder while the other 3 are sur plus grid feeder where 1 is a SPH4600 hybrid with diy 8 kWh battery. So in total 4x Min 4600 and 1 SPH 4600 with 2 different energy counters and a lot to track.
I will start slowly cause I have a lot to deal with like 5 WiFi S sticks that I have just upgraded.
But for now I will start reading the documentation to get it right once the ihost has arrived where HA should be running in docker so far cause I have no choise to run hassio on that plattform if I am right.
thanks for all the efforts.

I've never heard of a Sonoff IHost before, I'll have to do some research.
There's lots of options for how to run Grott, MQTT & HomeAssistant though, it's just a case of choosing/working out what's right in each scenario.
I've had confirmation that my new integration works with @egguy 's Grott add-on which is pretty cool. I'm going to update the documentation on my integration later today but that should simplify things for people using the 'Supervised' version of HomeAssistant.

hello, I'm new here, I don't understand much about programming, and sorry if I'm going to say something stupid!
I installed solar panels and became interested in home assistant.
I got a raspberry 3 where I installed the version provided in the official installation guide, I had version 2023.5.2 and it always worked well with the growatt integration without ever having any problems with the account or sensors, as the system was slow due to the sd card, I got a smart tv box x96 and installed armbian in the internal emmc storage with the latest version of HA 2023.5.4, I integrated growatt which went well but two hours later the bill it was blocked, there was no response from the sensors and no access through the shinephone.
I manage to unlock the account by changing the password through the server.growatt ...site  but it always locks up again when I turn on the HA !
It never happened with the raspberry 3 , it always worked fine, I think it's strange that it's a coincidence, as soon as I turned on the new box 2 hours later the account was blocked, there must be some difference in the code of the versions or the devices, it's hard to believe that they changed something on the growatt server at the same time as I upgraded the system...
maybe there is a logical explanation for this to happen, but I am boring because the main use of HA was to monitor production and now it is of little use because I cannot integrate the service that will immediately block the account.
sorry if this is not the right place to post this

hello, I'm new here, I don't understand much about programming, and sorry if I'm going to say something stupid! I installed solar panels and became interested in home assistant. I got a raspberry 3 where I installed the version provided in the official installation guide, I had version 2023.5.2 and it always worked well with the growatt integration without ever having any problems with the account or sensors, as the system was slow due to the sd card, I got a smart tv box x96 and installed armbian in the internal emmc storage with the latest version of HA 2023.5.4, I integrated growatt which went well but two hours later the account it was loocked, there was no response from the sensors and no access through the shinephone. I manage to unlock the account by changing the password through the server.growatt ...site but it always locks up again when I turn on the HA ! It never happened with the raspberry 3 , it always worked fine, I think it's strange that it's a coincidence, as soon as I turned on the new box 2 hours later the account was blocked, there must be some difference in the code of the versions or the devices, it's hard to believe that they changed something on the growatt server at the same time as I upgraded the system... maybe there is a logical explanation for this to happen, but I am boring because the main use of HA was to monitor production and now it is of little use because I cannot integrate the service that will immediately loock the account. sorry if this is not the right place to post this

Add sub user for this instance, and don't ask more then once in hour.

hello Muppet3000 , everything is still working fine for me with the 2 hour delay but now i have the next question. now using a new mod5000tl3-x with a shinelanbox and stick both with the newest software but the values stay 0. how to solve this ?
or is it solved with a shinelan wifi stick ?
thanks

hmm now i have a shinewifi-x on the mod5000tl3-x , still all zero's
where to find the issue ?
it al works in the growatt app , both times
if you have any thougths or solution let me know
thanks

If the data is there on your phone then it should appear on the module, it just pulls the data from the API. Like I've said before. I'd much prefer to help people use Grott instead of focus any more effort on this integration if possible.

Hello @muppet3000 ,
It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hi @szemod - no need to worry.  Grott takes care of both things - it updates MQTT so this integration will work in HA, but it also forwards the data to the Growatt servers so your phone app will continue working 100% normally.

Prefer to read inverter data from PIN 3 and 4
16:56:34	[D]	[sensor:093]	'Growatt Status Code': Sending state 1.00000  with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV Active Power': Sending state 21.20000 W with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV1 Voltage': Sending state 78.90000 V with 1 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV1 Current': Sending state 0.10000 A with 2 decimals of accuracy
16:56:35	[D]	[sensor:093]	'Growatt PV1 Active Power': Sending state 21.20000 W with 0 decimals of accuracy
16:56:35	[D]	[sensor:093]	'Growatt Grid Active Power': Sending state 20.80000 W with 0 decimals of accuracy
16:56:35	[D]	[sensor:093]	'Growatt Frequency': Sending state 50.03000 Hz with 2 decimals of accuracy
16:56:35	[D]	[sensor:093]	'Growatt Voltage Phase A': Sending state 233.40001 V with 1 decimals of accuracy
16:56:36	[D]	[sensor:093]	'Growatt Current Phase A': Sending state 0.90000 A with 2 decimals of accuracy
16:56:36	[D]	[sensor:093]	'Growatt Power Phase A': Sending state 22.80000 W with 0 decimals of accuracy
16:56:44	[D]	[sensor:093]	'Growatt Status Code': Sending state 1.00000  with 0 decimals of accuracy
16:56:44	[D]	[sensor:093]	'Growatt PV Active Power': Sending state 21.90000 W with 0 decimals of accuracy
16:56:44	[D]	[sensor:093]	'Growatt PV1 Voltage': Sending state 80.90000 V with 1 decimals of accuracy
16:56:44	[D]	[sensor:093]	'Growatt PV1 Current': Sending state 0.40000 A with 2 decimals of accuracy
16:56:45	[D]	[sensor:093]	'Growatt PV1 Active Power': Sending state 21.90000 W with 0 decimals of accuracy
16:56:45	[D]	[sensor:093]	'Growatt Grid Active Power': Sending state 21.60000 W with 0 decimals of accuracy
16:56:45	[D]	[sensor:093]	'Growatt Frequency': Sending state 50.02000 Hz with 2 decimals of accuracy
16:56:45	[D]	[sensor:093]	'Growatt Voltage Phase A': Sending state 236.90001 V with 1 decimals of accuracy
16:56:46	[D]	[sensor:093]	'Growatt Current Phase A': Sending state 0.30000 A with 2 decimals of accuracy
16:56:46	[D]	[sensor:093]	'Growatt Power Phase A': Sending state 24.50000 W with 0 decimals of accuracy
16:56:50	[D]	[sensor:093]	'Growatt WiFi Signal Sensor': Sending state -75.00000 dBm with 0 decimals of accuracy
16:56:51	[D]	[sensor:093]	'Growatt WiFi Signal Percent': Sending state 50.00000 % with 0 decimals of accuracy
16:56:54	[D]	[sensor:093]	'Growatt Status Code': Sending state 1.00000  with 0 decimals of accuracy
16:56:54	[D]	[sensor:093]	'Growatt PV Active Power': Sending state 22.50000 W with 0 decimals of accuracy
16:56:54	[D]	[sensor:093]	'Growatt PV1 Voltage': Sending state 80.90000 V with 1 decimals of accuracy
16:56:54	[D]	[sensor:093]	'Growatt PV1 Current': Sending state 0.30000 A with 2 decimals of accuracy
16:56:55	[D]	[sensor:093]	'Growatt PV1 Active Power': Sending state 22.50000 W with 0 decimals of accuracy
16:56:55	[D]	[sensor:093]	'Growatt Grid Active Power': Sending state 22.10000 W with 0 decimals of accuracy
16:56:55	[D]	[sensor:093]	'Growatt Frequency': Sending state 50.03000 Hz with 2 decimals of accuracy
16:56:55	[D]	[sensor:093]	'Growatt Voltage Phase A': Sending state 234.10001 V with 1 decimals of accuracy
16:56:55	[D]	[sensor:093]	'Growatt Current Phase A': Sending state 0.40000 A with 2 decimals of accuracy
16:56:56	[D]	[sensor:093]	'Growatt Power Phase A': Sending state 23.40000 W with 0 decimals of accuracy

any 5th second all data come ;)

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

To echo what @Snux said, unless you explicitly tell Grott to NOT forward to Growatt, it will continue to upload to the Growatt servers as well.

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hi @szemod - no need to worry. Grott takes care of both things - it updates MQTT so this integration will work in HA, but it also forwards the data to the Growatt servers so your phone app will continue working 100% normally.

Hi @Snux, Many thanks for your quick reply! I decided to switch to Grott based solution, however, I sucked on the Setup - Inverter/Data Logger Configuration to replace the server.growatt.com to IP address and port of GROTT as on the configuration screen of my WiFi stick there is no PORT I can define, only web address or IP address. I tried to add the IP only and it shows connected on the  Inverter/Data Logger Configuration page, but data NOT sent to GROTT nor to Growatt. If I add the port after the IP address like <IP_ADDRESS>:5279 it is not accepted by the field of the configuration page.
Pls advise.

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hi @szemod - no need to worry. Grott takes care of both things - it updates MQTT so this integration will work in HA, but it also forwards the data to the Growatt servers so your phone app will continue working 100% normally.

Hi @Snux, Many thanks for your quick reply! I decided to switch to Grott based solution, however, I sucked on the Setup - Inverter/Data Logger Configuration to replace the server.growatt.com to IP address and port of GROTT as on the configuration screen of my WiFi stick there is no PORT I can define, only web address or IP address. I tried to add the IP only and it shows connected on the Inverter/Data Logger Configuration page, but data NOT sent to GROTT nor to Growatt. If I add the port after the IP address like <IP_ADDRESS>:5279 it is not accepted by the field of the configuration page. Pls advise.

Have you tried setting it through the Growatt Website?

Just click on "Data Logger Setting" and it gives you the options

You don't need to specify the port. It uses internally the 5279 port, so you just have to make sure you don't use another port for your Grott installation/port forwarding.

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hi @szemod - no need to worry. Grott takes care of both things - it updates MQTT so this integration will work in HA, but it also forwards the data to the Growatt servers so your phone app will continue working 100% normally.

Hi @Snux, Many thanks for your quick reply! I decided to switch to Grott based solution, however, I sucked on the Setup - Inverter/Data Logger Configuration to replace the server.growatt.com to IP address and port of GROTT as on the configuration screen of my WiFi stick there is no PORT I can define, only web address or IP address. I tried to add the IP only and it shows connected on the Inverter/Data Logger Configuration page, but data NOT sent to GROTT nor to Growatt. If I add the port after the IP address like <IP_ADDRESS>:5279 it is not accepted by the field of the configuration page. Pls advise.

Have you tried setting it through the Growatt Website?

Just click on "Data Logger Setting" and it gives you the options

Hi @muppet3000! I looked on the Growatt Website how to add the port, but in the end it was not needed, as the IP address in the WiFi stick AP setup was enough without the port, and both of my inverters appeared on MQTT. However, the data/values are similar but not the same. For example. Growatt integration shows sensor.bu32912xxx_lifetime_energy_output>17328.8, MQTT integration shows sensor.bu32912xxx_lifetime_solar_energy>18341.2. Of course, the difference in name does not bother me, but the difference in values does. Not only that, but the current output power is also higher on MQTT than on Growatt integration. If I compare it on a graph, it is consistently drawn a little above it. Do you have any idea what could be causing this difference?

Hello @muppet3000 , It's fully understandable that you want to focus on a Grott-based solution only instead of fragmenting your resources. However, I still struggle to re-add daily this integration using different accounts: I'm using two Growatt accounts, so once the 1st is locked I delete the integration and add it back with my 2nd account. The reason I do this is because if I understood correctly: if I change the server.growatt .com on the inverter's WiFi AP settings to Grott, then the official app will not be updated anymore, which I would like to avoid as I still using the official Growatt app on my phone. Please advise if is there any other way than switch to your Grott based solution to avoid re-add the integration because of a locked account.

Hi @szemod - no need to worry. Grott takes care of both things - it updates MQTT so this integration will work in HA, but it also forwards the data to the Growatt servers so your phone app will continue working 100% normally.

Hi @Snux, Many thanks for your quick reply! I decided to switch to Grott based solution, however, I sucked on the Setup - Inverter/Data Logger Configuration to replace the server.growatt.com to IP address and port of GROTT as on the configuration screen of my WiFi stick there is no PORT I can define, only web address or IP address. I tried to add the IP only and it shows connected on the Inverter/Data Logger Configuration page, but data NOT sent to GROTT nor to Growatt. If I add the port after the IP address like <IP_ADDRESS>:5279 it is not accepted by the field of the configuration page. Pls advise.

Have you tried setting it through the Growatt Website?

Just click on "Data Logger Setting" and it gives you the options

Hi @muppet3000! I looked on the Growatt Website how to add the port, but in the end it was not needed, as the IP address in the WiFi stick AP setup was enough without the port, and both of my inverters appeared on MQTT. However, the data/values are similar but not the same. For example. Growatt integration shows sensor.bu32912xxx_lifetime_energy_output>17328.8, MQTT integration shows sensor.bu32912xxx_lifetime_solar_energy>18341.2. Of course, the difference in name does not bother me, but the difference in values does. Not only that, but the current output power is also higher on MQTT than on Growatt integration. If I compare it on a graph, it is consistently drawn a little above it. Do you have any idea what could be causing this difference?

Hi @muppet3000 , it is funny, but I set the port following your advice on the Website of Growatt, and then the data became accurate, with only a little delay in time (MQTT updated a few minutes earlier). Thx for your help!

No problem.
@szemod  - If you have any issues with the other integration, please could you log it over in the other repo?

No problem. @szemod - If you have any issues with the other integration, please could you log it over in the other repo? This one: https://github.com/muppet3000/homeassistant-grott

At the moment, everything has been done, it just took a little time, and of course, the determination was missing until now :). Thanks for everything, great job!

Prefer to read inverter data from PIN 3 and 4
16:56:34	[D]	[sensor:093]	'Growatt Status Code': Sending state 1.00000  with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV Active Power': Sending state 21.20000 W with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV1 Voltage': Sending state 78.90000 V with 1 decimals of accuracy

...

any 5th second all data come ;)

@Saentist I have been thinking about doing the same. Do you mind sharing what hardware you used to read the inverter data? On the bottom of my inverter is a plug labeled "COM", are you somehow sniffing the traffic from these pins? I'd be very grateful if you can share a bit on the protocol used, eg. is it (like the name suggests) a simple UART interface?

I'll also add that @muppet3000 thank you so much for all the hard work on the topic; even though I have come to detest the customer hostility of growatt and wish I went for a more developer friendly inverter, your work made integrating with home assistant a lot more bearable :)

Prefer to read inverter data from PIN 3 and 4
16:56:34	[D]	[sensor:093]	'Growatt Status Code': Sending state 1.00000  with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV Active Power': Sending state 21.20000 W with 0 decimals of accuracy
16:56:34	[D]	[sensor:093]	'Growatt PV1 Voltage': Sending state 78.90000 V with 1 decimals of accuracy

...

any 5th second all data come ;)

@Saentist I have been thinking about doing the same. Do you mind sharing what hardware you used to read the inverter data? On the bottom of my inverter is a plug labeled "COM", are you somehow sniffing the traffic from these pins? I'd be very grateful if you can share a bit on the protocol used, eg. is it (like the name suggests) a simple UART interface?

https://www.aliexpress.com/item/1005004488790892.html
+
https://www.aliexpress.com/item/32836213346.html
+
https://esphome.io/components/sensor/growatt_solar.html
it need to use RS485 pair of inverter but not this one used for limiter.

Click me
esphome:
  name: esp8266
  friendly_name: 8266

esp8266:
  board: nodemcuv2

# Enable logging
logger:
  level: DEBUG
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "ktakBT+xxxxxxxxxxxxxxxxxxxxxxxx+WFjbwM="

ota:
  password: "xxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "2 Fallback Hotspot"
    password: "12345678"

captive_portal:

# Example configuration entry
web_server:
  port: 80

# Example configuration entry
uart:
  - id: gw_uart
    baud_rate: 9600
    tx_pin: GPIO1
    rx_pin: GPIO3

modbus:
  uart_id: gw_uart
  flow_control_pin: GPIO4

  ### Restart
switch:
  - platform: restart
    name: "NodeMCU v2 Restart"
  ### End Restart

sensor:
  ### uptime
  - platform: uptime
    id: uptime_sec
  ### uptime end
  ### WIFI SIGNAL REPORT
  - platform: wifi_signal
    name: "Growatt WiFi Signal Sensor"
    update_interval: 60s
    entity_category: "diagnostic"
    id: wifi_signal_db

  - platform: copy # Reports the WiFi signal strength in %
    source_id: wifi_signal_db
    name: "Growatt WiFi Signal Percent"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    entity_category: "diagnostic"

  ### WIFI SIGNAL REPORT END

  - platform: growatt_solar
    update_interval: 10s
    protocol_version: RTU2

    inverter_status:
      name: "Growatt Status Code"

    phase_a:
      voltage:
          name: "Growatt Voltage Phase A"
      current:
          name: "Growatt Current Phase A"
      active_power:
          name: "Growatt Power Phase A"
  #  phase_b:
  #    voltage:
  #        name: "Growatt Voltage Phase B"
  #    current:
  #        name: "Growatt Current Phase B"
  #    active_power:
  #        name: "Growatt Power Phase B"
  #  phase_c:
  #   voltage:
  #        name: "Growatt Voltage Phase C"
  #    current:
  #        name: "Growatt Current Phase C"
  #    active_power:
  #        name: "Growatt Power Phase C"

    pv1:
      voltage:
          name: "Growatt PV1 Voltage"
      current:
          name: "Growatt PV1 Current"
      active_power:
          name: "Growatt PV1 Active Power"

#    pv2:
#      voltage:
#          name: "Growatt PV2 Voltage"
#      current:
#          name: "Growatt PV2 Current"
#      active_power:
#          name: "Growatt PV2 Active Power"

    active_power:
      name: "Growatt Grid Active Power"

    pv_active_power:
      name: "Growatt PV Active Power"

    frequency:
      name: "Growatt Frequency"

    energy_production_day:
      name: "Growatt Today's Generation"

    total_energy_production:
      name: "Growatt Total Energy Production"

    inverter_module_temp:
      name: "Growatt Inverter Module Temp"

### uptime to text
text_sensor:
  - platform: template
    name: 8266 Uptime
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 113s
### uptime text end

Fantastic, thank you so much!

Growatt blocked my mobile  app account cause of Homeassistant.
So i have 2 different routers in my house and i want to transfer the application to the other router and my installer dosent give the installer password to proceed and create a new account.
Or even change it by himself. Or unblock the mobile app if thats possible
Question can he remotely change the ip and connect my inverters to the other router?
If not Does any1 has an installer password to proceed with a new account and reinstall them to new router
Thanks in advanced


Missing license

Please choose some license
I would recommend MIT License, so everyone keep your credit and help your with your code.
If you don't want your code to be sold use GNU GPLV3 instead.
When a repository is not licensed this happens.

Thanks for the colaboration!


quote is a typst element

quote is currently a Typst element, so it clashes with your use of quote, perhaps you can rename as quotation or blockquote?
https://typst.app/docs/reference/model/quote/

True, I will think about a different name.


zathura with mupdf backend cannot load html src images

Hello,
Thanks for your great work!
I compiled zathura with mupdf backend on debian 12. With mupdf-gl/x11, epub books can be loaded without problems except for the epub 3.0 warning, pictures are shown. However with zathura-mupdf, images are not shown. Error log is attached.
$ zathura The\ Secret\ Lives\ of\ Numbers.epub
info: Opening plain database via sqlite backend.
info: No plain database available. Continuing with sqlite database.
warning: unknown epub version: 3.0
warning: html: cannot load image src='../images/9780063206076_Cover.jpg'
warning: html: cannot load image src='../images/tit.jpg'
warning: html: cannot load image src='../images/rt2.jpg'
warning: html: cannot load image src='../images/f002-01.jpg'
warning: html: cannot load image src='../images/f007-01.jpg'
warning: html: cannot load image src='../images/f010-01.jpg'
...

Any ideas how can I compile zathura to fix this?
Thanks.

We'll probably need an epub to reproduce and fix this. As always with the mupdf plugin, help is greatly appreciated.

Can you try the epub file attached? (Just changed extention zip <--> epub) It will produce an error saying epub 3.0 something and cannot load src image. The original epub I used in the first post is too big to upload here.
Kairos.en.zip

Greetings, I have been trying to install mupdf, as a backend for zathura, but when installing the zathura-pdf-mupdf plugin, the following error appears, preventing its full operation. I would like your help.
I have it installed via source code:
mupdf 1.25.2
zathura 0.5.10
zathura-pdf-mupdf 0.4.4
Error I'm getting:
lesperanca@tux:~/Downloads/zathura-pdf-mupdf-0.4.4$ meson build/
The Meson build system
Version: 1.0.1
Source dir: /home/lesperanca/Downloads/zathura-pdf-mupdf-0.4.4
Build dir: /home/lesperanca/Downloads/zathura-pdf-mupdf-0.4.4/build
Build type: native build
Project name: zathura-pdf-mupdf
Project version: 0.4.4
C compiler for the host machine: cc (gcc 12.2.0 "cc (Debian 12.2.0-14) 12.2.0")
C linker for the host machine: cc ld.bfd 2.40
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found pkg-config: /usr/bin/pkg-config (1.8.1)
Run-time dependency zathura found: YES 0.5.10
Run-time dependency girara-gtk3 found: YES 0.4.5
Run-time dependency glib-2.0 found: YES 2.74.6
Run-time dependency cairo found: YES 1.16.0
Dependency mupdf found: NO found 1.19.0 but need: '>=1.25.2'
Found CMake: /usr/bin/cmake (3.25.1)
Run-time dependency mupdf found: NO (tried pkgconfig and cmake)
Library mupdf-third found: YES
Has header "mupdf/fitz/version.h" : YES
Has header "mupdf/fitz.h" : YES
Has header "mupdf/pdf.h" : YES
Library mupdf found: YES
Compiler for C supports arguments -Werror=implicit-function-declaration: YES
Compiler for C supports arguments -Werror=vla: YES
Program desktop-file-validate found: YES (/usr/bin/desktop-file-validate)
Program appstream-util found: YES (/usr/bin/appstream-util)
Build targets in project: 1
Found ninja-1.11.1 at /usr/bin/ninja
WARNING: Running the setup command as meson [options] instead of meson setup [options] is ambiguous and deprecated.
@h9j6k

You still need to run ninja to build it and install it. There is no error as far as I can see.

This error that appears about the installed plugin, I don't know how to solve it:
lesperanca@tux:~/Documentos$ zathura -d “DevOps in practice - reliable and automated software delivery - Casa do Codigo.pdf”
error: Could not load plugin '/usr/local/lib/x86_64-linux-gnu/zathura/libpdf-mupdf.so' (/usr/local/lib/x86_64-linux-gnu/zathura/libpdf-mupdf.so: undefined symbol: js_tointeger).
warning: Found no plugins. Please install at least one plugin.
error: Could not create 'DevOps in practice - reliable and automated software delivery - Casa do Codigo.pdf': Not a directory
info: Opening plain database via sqlite backend.
info: No plain database available. Continuing with sqlite database.
error: Could not open database: DevOps in practice - reliable and automated software delivery - Casa do Codigo.pdf/bookmarks.sqlite
error: Unable to initialize database. Bookmarks won't be available.

Your build is broken: undefined symbol js_toinger. But this is completely unrelated to the issue in question.
Also, -d is used to specify the data directory which explains all the other errors.


What does it mean if explaining image instance is entirely green?

Hi, I've used Lime on a pytorch CNN model trained on the MNIST dataset.
The problem I'm having is that it works fine for most instances where it properly displays the boundaries but on certain predictions the following code:
temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=True, num_features=5, hide_rest=False)
img_boundry1 = mark_boundaries(temp/255.0, mask)
plt.imshow(img_boundry1)
would just show the base image and setting positive_only to False makes the entire image green with no boundaries.
Am I doing something wrong? It works for some images and others have this issue

Check explanation.local_exp, I'm guessing the segmentation function is probably not segmenting the image into more than 5 superpixels.


This was brought up previously but closed: https://github.com/laravel/framework/issues/31530#issuecomment-1346428183

This was brought up previously in https://github.com/laravel/framework/issues/31530 but was closed.
Really hope these options are added. It’s essential for performing safe migrations via CI/CD in enterprise environments.
Some more background in this Planetscale article: https://planetscale.com/blog/zero-downtime-laravel-migrations. Their current recommendation
Planetscale basically advises NOT using php artisan migrate in production- that’s how serious a problem this can be:

Running php artisan migrate on your production database at deployment can be dangerous, as this can lock your database, preventing reads and writes.

Originally posted by @binaryfire in https://github.com/laravel/framework/discussions/44757#discussioncomment-4380863

Sorry, this reply somehow posted as new issue! Closing


Password encryption

I wan't to know how hard would it be to have encrypted password in a file.
Just in case some users get the access to the git project.

You're probably talking about the postfix/accounts.cf.
It's possible, but you'll have to add a third col in the file to specify current encoding.
You could have PLAIN and MD5.
Then you'll have to modify this part to do something conditional using this new value (don't encode if already encoded).
It's a good idea.
If you want to submit a PR (with integration tests, I will help you if needed), I'll be happy to merge it.

Both lines 25 & 26 uses the pass. The first is easy to manage.
The second, I don't know right now. you have to check how saslpasswd2 can use an already encrypted password.

Ok I will do it, thanks for the short explaination.

So I did had a look.
I can't make the implement you discribed because of saslpasswd2 as you said.
saslpasswd2 -h

This product includes software developed by Computing Services
at Carnegie Mellon University (http://www.cmu.edu/computing/).

saslpasswd2: usage: saslpasswd2 [-v] [-c [-p] [-n]] [-d] [-a appname] [-f sasldb] [-u DOM] userid
	-p	pipe mode -- no prompt, password read on stdin
	-c	create -- ask mechs to create the account
	-d	disable -- ask mechs to disable/delete the account
	-n	no userPassword -- don't set plaintext userPassword property
	  	                   (only set mechanism-specific secrets)
	-f sasldb	use given file as sasldb
	-a appname	use appname as application name
	-u DOM	use DOM for user domain
	-v	print version numbers and exit

If it can't be done using non altered software... I think we can close the issue.
I keep in mind the need, just in case...


 Could you provide a Dockerfile? Thanks!

We've moved the project over to bitcore-node, and now distribute binaries, which should also help. I've copied this issue over to https://github.com/bitpay/bitcore-node/issues/122


Removed ie6 support, added jquery 2.2 support

I changed the code, I will close this pull request and send other soon...


scram

Add SCRAM-SHA-1, SCRAM-SHA-256 and SCRAM-SHA512 auth.

Replaced by:

https://github.com/mattn/go-xmpp/pull/147


Particles out of bounds in idealized curvilinear domain

I am trying to use Parcels for offline Lagrangian particle integration in fields derived from ROMS (coupled to SWAN via COAWST) simulations of wave-driven flow on an idealized island. The annulus grid is curvilinear, laterally periodic, and irregularly-spaced (shown below) on an f-plane at latitude -30°.

The velocity field in polar coordinates after 14 days of constant radially symmetric wave-forcing on the outer boundary looks like

(sorry for the oddly formatted figure - I'm still getting familiar with hvplot)
Anyway, for some reason Parcels has problems integrating particle tracks on some parts of the domain, but not others. Here are trajectories for single particles seeded in each reef pass jet integrated for 12 hours just using the surface (u,v) fields (particle scatter color is mapped to time).

Based on print output from my recovery kernel, Parcels seems to think the particles seeded in most of the jets are not in bounds from the get go. One thing that has me a bit worried is that when I plot a field using fieldset.V.show(), only one section of the domain is displayed (although particle integration seems to work for some locations outside of this slice and not others), even though fieldset.V.lon and fieldset.V.lat clearly have the correct shape and values for the full annulus.

Below is the code I use to load the model output, create the particleset+fieldset, and do the integration calling "mpirun -np x python driftersIntegrate.py". I've also provided a Dropbox link to the ROMS netcdf file in case that is helpful. ncks was used to extract just the top sigma level and every 6th time slice to reduce file size. I haven't tried to implement the periodic boundary condition yet because I want to sort this issue out first, but hopefully that will come next. Thank you very much in advance - Parcels is an awesome code!
https://www.dropbox.com/s/hmzgyo7d4mzi5lk/anntest_strided.nc?dl=0
Import Modules
import os
import sys
import xarray as xr
import netCDF4 as nc
import numpy as np
import cmocean
from datetime import timedelta as delta
from parcels import AdvectionRK4, ErrorCode, FieldSet, JITParticle, ParticleFile, ParticleSet, Variable, plotting

Load data
home = os.environ['HOME']
filename = home + '/Desktop/anntest_strided2D.nc'
Ds = xr.open_dataset(filename)
lon = Ds['lon_psi'].values
lat = Ds['lat_psi'].values
angle_psi = 0.25*( Ds.angle.isel(eta_rho = slice(0, -1), xi_rho = slice(0, -1) ) \
         + Ds.angle.isel(eta_rho = slice(1, None), xi_rho = slice(1, None) ) \
         + Ds.angle.isel(eta_rho = slice(1, None), xi_rho = slice(0, -1) ) \
         + Ds.angle.isel(eta_rho = slice(0,-1), xi_rho = slice(1,None)) ).rename({'xi_rho': 'xi_psi', 'eta_rho': 'eta_psi'}) #to psi points

Interpolate Arakawa C-grid velocity components to psi/f points, calculate Lagrangian velocity, then rotate to eastward/northward orientation
#velocity to psi points
u_eulerian = 0.5*( Ds['u'].isel(eta_u = slice(0,-1)) + Ds['u'].isel(eta_u = slice(1,None)) ).rename({'xi_u': 'xi_psi', 'eta_u': 'eta_psi'})
v_eulerian = 0.5*( Ds['v'].isel(xi_v = slice(0,-1)) + Ds['v'].isel(xi_v = slice(1,None)) ).rename({'xi_v': 'xi_psi', 'eta_v': 'eta_psi'})
u_stokes = 0.5*( Ds['u_stokes'].isel(eta_u = slice(0,-1)) + Ds['u_stokes'].isel(eta_u = slice(1,None)) ).rename({'xi_u': 'xi_psi', 'eta_u': 'eta_psi'})
v_stokes = 0.5*( Ds['v_stokes'].isel(xi_v = slice(0,-1)) + Ds['v_stokes'].isel(xi_v = slice(1,None)) ).rename({'xi_v': 'xi_psi', 'eta_v': 'eta_psi'})
u = u_eulerian + u_stokes
v = v_eulerian + v_stokes
uveitheta = (u + 1j*v)*np.exp(1j*angle_psi) #rotate to eastward and northward
u_eastward  = np.real(uveitheta.isel(s_rho = -1)) #top slice
v_northward = np.imag(uveitheta.isel(s_rho = -1)) #top slice

Initialize fieldset, particleset, and recovery+advection kernel
#set fieldset
data = {'U': u_eastward.values, 'V': v_northward.values} #2D velocity
dimensions = {'lon': lon, 'lat': lat, 'time': t }
fieldset = FieldSet.from_data(data, dimensions, transpose = False, mesh = 'spherical', time_periodic = t[-1] - t[0])
fieldset.V.show()

#recovery kernel
def DeleteParticle(particle, fieldset, time):
    print("Deleting particle")
    particle.delete()

recovery = {ErrorCode.ErrorOutOfBounds: DeleteParticle,
            ErrorCode.ErrorThroughSurface: DeleteParticle}

#initialize particleset
theta = np.linspace(0, 2*np.pi, 12, endpoint = False) + np.pi/12
lonp = .1*np.cos(theta)
latp = .1*np.sin(theta)
pset = ParticleSet.from_list(fieldset = fieldset, pclass = JITParticle, lon = lonp.tolist(), lat = latp.tolist() )
kernels = AdvectionRK4
output_file = pset.ParticleFile(name= "PeriodicParticle", outputdt = delta(seconds = 300) )

Integrate for 12 hours and save output
pset.execute( kernels, runtime = delta(hours = 12.0), dt = delta(seconds = 60), output_file = output_file, recovery = recovery )
output_file.export()
output_file.close()

Hey @erikvansebille thanks so much for being willing to look into it! Maybe there are circumpolar applications we could reference?

Dear @wingtorres. I now had a look at your data file, and as I feared the topology of this simulation is really quite a challenge to Parcels. When we developed the curvilinear capabilities, we just didn't expect these extremely curved grids. The point is that Parcels expects monotonically increasing lot and lat grids, which is not the case in your simulation
If you really want to keep using Parcels, the easiest solution probably is to interpolate your fields onto a regular grid; although regridding is never ideal because it introduces errors in the interpolation. Do you have another Lagrangian code that does work on this topology?

Hi @erikvansebille thank you for investigating, and it is totally understandable that Parcels was not designed with this kind of case in mind. Might another solution be to just re-generate the grid as if it were at a pole? That way lon/lat would be monotically increasing and I could then conceivably use zonally periodic BC's. The central reference point is arbitrary because it is an idealized domain, and I am manually setting it to an f-plane anyway.
ROMS' online particle integration does work with this domain, but enabling floats grievously slowed down the computation so I ended up not going that route. Below is a snapshot of 5000 online particle tracks initially seeded evenly throughout the lagoon after three days time.

Wow, this figure looks amazingly beautiful! Would be great to check if Parcels can produce similar figures, and also be efficient. Indeed, moving the pole to the centre of the torus could be a very good strategy. Let us know if it works!

hey @erikvansebille good news - moving the grid to the North pole worked! I'm not sure if ROMS coordinates are referenced on a geoid or spherical earth, but a spherical transformation seemed to work fine at the very least for visualization purposes.
r = 6378e3 #radius of earth at equator. does ROMS account for geoid?
z = (r**2 - x**2 - y**2)**0.5
lon, lat = (180/np.pi)*np.arctan2(y,x) , 90-(180/np.pi)*np.arccos( z/r )

then I followed the Periodic Boundary tutorial to create the zonal halo and periodic BC kernel.
Regarding the figure... I made that figure in Blender by reading in particle tracks through its Python API and animating them as curves with halo/particle system effects, but I've found that the Python package Datashader can produce really nice results as well with much less of a learning curve . Datashader seems really well equipped to handle tons of data points even with minimal computing resource (i.e. just a laptop), so it may be of interest to you.
Here are the results for 2^14 particles seeded initially in the backreef+lagoon on the annulus/torus problem (this time w/ coriolis turned on) and integrated for 48 hours. The color here should be proportional to the density of pathlines over the integration period. I this nicely illustrates how some particles that leave via the wave-driven jets come back over the reef crest and recirculate, but many continue on and join neighboring jets instead. This was done just with a static slice of output though - I suspect the offline integration will look more chaotic.

import os
import xarray as xr
import numpy as np
import hvplot.xarray
import hvplot.pandas
import datashader as ds
import datashader.transfer_functions as tf
import holoviews as hv
import cmocean
hv.extension('bokeh')
renderer = hv.renderer('bokeh')

particlename = "~/Dropbox/Oceanography/Projects/annulus/floats/annFloats.nc"
Dp = xr.open_dataset(particlename, decode_times = False)
df = Dp.to_dataframe()
df.loc[[0], ['lon','lat']] = np.nan #add intermittent row with nans (first observation) to separate lines
df = df.sort_values(['trajectory', 'obs']) #organize by trajectory then order by time

cvs = ds.Canvas(plot_width = 1200, plot_height = 1200)
agg = cvs.line(dp, 'lon', y = 'lat', agg = ds.count())
img = tf.shade(agg, cmap = cmocean.cm.ice, how = "eq_hist")
plot = tf.set_background(tf.dynspread(img, threshold = 0.25, max_px = 4), 'black')
plot

Thanks @wingtorres, this is really great. Beautiful visualization! I’m ping-ing @CKehl, who is also very interested in visualizations. Great that you’ve been able to make this work with a relatively simple coordinate transformation

Hi - yeah, the renderings are aesthetically quite pleasing! I also know the bokeh rendering engine - there are actually quite some InfoVis frameworks build on top of it. Thanks for the forward of 'Datashader' - that seems to deserve some more attention indeed. From what I see, the coriolis force is the driving factor in the simulation, with the toroidal drift of the particles. The darkerning mid-bad around the torus looks a bit 'artificial' - would be interesting to see what happened with the particles there, or if that's just a visualisation artefact. Thanks for sharing your results, and giving some inspiration to those advanced plotting libraries!

@CKehl  - The darkening mid band I think you are referring is inside of the wave break where the reef is very shallow and flows are fast so the circulation isn't as much affected by Coriolis and the particles initially seeded there are quickly flushed out through the jets. So I believe the visualization is reflecting the physics accurately, but an animation would likely help to verify this. Thanks for your comment! I'm really impressed by both Parcels and Datashader, because the integration and visualization were done in <2 min compute time on just my personal laptop.


Schedule Name Selector

The Schedule Name selector currently allows the dashboard user to add Schedule Names.  This should not be possible.
The Schedule Names should be configured only from the grafana panel edit menu.  Within the edit menu, there should be a field to add to a list of pre-defined Schedule Names.   The user should only be able to select from this list of pre-defined names.

Same as https://github.com/NubeIO/grafana-schedule-panel-build/issues/1

Same as https://github.com/NubeIO/grafana-schedule-panel-build/issues/1

@CanuckMarc
Can you confirm the following things:

if this schedule name applies to the holiday event as well?
Can the title(schedule name in Weekly and Daily events) be overridden by the user or restricted to only the schedule names predefined in the side panel?

I don't think we have quite decided how the holiday schedule will be implemented (i don't think it does much right now).  For now, the pre-defined schedule options should apply to the holiday Schedule Name select too.

No, the user should not be able to enter their own Schedule Names.  All options should be pre-defined in edit settings.

If you have more time after, check out the other schedule issues, there are a few others that might be easy fixes.

Yes, I have checked them out and figured out the problem is making them available for edit for the user.
Hey, Can you provide me feedback on this UI that I've made for the schedule names to be added from the config?
Haven't finished it yet but is this something that you want?
DEMO

yes, that looks good for the settings interface.  Then user just needs to be able to select from that list from event weekly or holiday schedule making popup.


Move thread body logic into a private static method

This is for fixing issue #18083
Clang doesn't support adapting calling convention when converting a
non-capturing lambda into a function pointer, and it doesn't
support tagging a lambda with calling convention AFAICT. In
thd_windows.cc, we create the thread body lambda and pass it to
CreateThread(), which fails to build on clang because it cannot
convert the lambda into stdcall function. Note that this bug only
happens when building for x32 architecture. x64 is not affected because
there is only one standard x64 calling convention.
This change fixes this by moving the thread body logic into a private
static method and tagging it with WINAPI (which expands to __stdcall).

Thank you for your pull request. Before we can look at your contribution, we need to ensure all contributors are covered by a Contributor License Agreement.
After the following items are addressed, please respond with a new comment here, and the automated system will re-verify.

User @equinox1993 isn't covered by a CLA. They will need to complete the form at https://identity.linuxfoundation.org/projects/cncf

Regards,
CLA GitHub bot

Thank you for your pull request. Before we can look at your contribution, we need to ensure all contributors are covered by a Contributor License Agreement.
After the following items are addressed, please respond with a new comment here, and the automated system will re-verify.

User @equinox1993 isn't covered by a CLA. They will need to complete the form at https://identity.linuxfoundation.org/projects/cncf

Regards, CLA GitHub bot

I just added myself to the Google org, so I believe I'm covered by CLA now..

It's not automatic. I think you still have to go through the bot. This is because our CLA comes from CNCF these days, not Google (we donated gRPC to CNCF a while ago)

It looks like Distribution tests and Portability tests for Windows worked so I think we'll probably be good to merge once you sign the CLA.

Thanks for your contribution! Merged.

You are welcome. Thank you for reviewing and merging promptly!


Agent manually started in Azure should not modify agent properties

When Agent is run on Azure VM it always sets azure.instance.name and ultimately presents it to server as Agent name, even when Server is not configured to use Cloud Agents and the agent is manually configured to use different name through buildAgent.properties, like this:
name=AZSC-TCBUILD-1
system.agent.name=AZSC-TCBUILD-1
teamcity.agent.name=AZSC-TCBUILD-1
All of the above is ignored and azure instance name is used instead. This creates substantial problem, because all VMs created (manually) from the same image get that instance name identical and they collide when try to register on TeamCity server.

Any update on this? Dealing with this issue too.

removing azure cloud plugin will help, if you are not using Cloud agents. If you do - please wait for a fix this week.

fixed in 0.2.63.


Parent Model --> Finetuned from model

This change matches the wording in the template to the corresponding metadata variable.

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint.


[Mobile] Refreshing page block continuation of activities on PDP

Current behavior
Refreshing page block continuation of activities on PDP - functions don't work (changing size, color, add to favorite)
Expected behavior
Refreshing page doesn't block continuation of activities on PDP
Steps to reproduce the issue

Open any PDP on mobile
Refresh page
Try to change color or size, add to favorite, add to cart

Environment details
https://test.storefrontcloud.io/
mobile phone
Additional information

@patzick is it still a case?

Can't reproduce this issue anymore please do verify @ibugaj

@pkarw I still have this issue on my mobile. I use Chrome 72.0.3626.76 on Android 7.0

@ibugaj can you clear storage on this mobile device and try once more?
@patzick can you check this one?

Yes @pkarw , I started from clear storage, but I have a little problem with this - it still keeps on waiting..:

So I cleared history manually only.
But earlier I checked this issue also on another phone and there also issue was

I just investigated this issue and I can confirm - the problem exists.
As far as I could check, it occurs only on Chrome / Android environment. Tested on many combinations, both in real devices and browserstack.
Other browsers, as well as Chrome working on iOS seem to be unaffected.

Can’t reproduce this error anymore

@pkarw
Unfortunately, bug still exist. As I mentioned before, it occurs on chrome browser working in android.
I just recreated it on all our test environments. Used my own phone, all physical devices we have on test stand, as well as browserstack - its universal. I cleared device cache before every test.
Problem is NOT reproducable in mobive view of PC browser.
After refreshing product page:
Picture is replaced by placeholder
Clicking on filters (color, size) has no effect
Clicking 'addd to cart' displays cliking animation, but wont add product to cart
Adding to wishlist is not working


Zoom to extent quest continues

@springmeyer

So the actionable thing is to make sure that setting a custom Extent in the UI is respected

Not quite sure what that implies exactly.
Should Editor.prototype.zoomToLayer

look at the Extent values coming from the GUI first
if they do not equal (default) full Web Mercator bounding box, use those and not query the data for its extent
if they equal full WebMerc bbox query the data (as is now)

Investigation of current behavior
I used https://github.com/mapbox/mapnik-test-data/tree/master/data/shp/world_merc and imported that into PostGIS.
Buffer size: 0
(SELECT
	*
FROM
	world_merc
) AS data

I started with the extent of tile 5/17/11.
bbox:
1252344.271424327 5009377.085697312
2504688.542848654 6261721.357121639

Shrunk the bbox by ~500m on each side and put that into the Extent field:
1252845,5009888,2504187,6261220

As is now, clicking on Zoom to extent zooms to full WebMercator extent.
Extent is honored as data is clipped (red -> Extent ).
z5

But zooming out reveals that data is not clipped to the Extent but to the tile that contains said Extent.
This is by design?
z4

z3

z0

So the actionable thing is to make sure that setting a custom Extent in the UI is respected

Not quite sure what that implies exactly.

What I mean is that:

If the user sets a custom Extent in the UI we should make sure:

The value is properly saved to the data.yml
That values is respected for all other operations (including the zoom to functionality and we should also check what impact it has on the export functionality - which I presume should use the cumulative extent of all layers)

If the user does not set a custom Extent then we should make sure:
The extent of the data is used based on what Mapnik detects ds.extent().
If the ds.extent() fails (or the larger function that calls it) for some reason the we should log why and default to the global extent.

One major problem that is lurking is that https://github.com/mapbox/mapbox-studio-classic/blob/cec96c696f5a0469340c7714c77462fd3aa4280e/lib/source.js#L368-L374 currently sets a global extent in the data.yml when a layer is saved. This I think is a problem. Instead we should be asking mapnik for this extent and saving that.

Should Editor.prototype.zoomToLayer
look at the Extent values coming from the GUI first
if they do not equal (default) full Web Mercator bounding box, use those and not query the data for its extent
if they equal full WebMerc bbox query the data (as is now)

I think Editor.prototype.zoomToLayer should get the extent from the /metadata? endpoint like done in https://github.com/mapbox/mapbox-studio-classic/pull/1515 and trust it. Nothing more needed in app/source.js. The problem I see is that https://github.com/mapbox/mapbox-studio-classic/pull/1515 is not fully working yet for PostGIS, but let's discuss the details over at #1515.


docker distribution golang vulnerabilities

Hi experts,
Currently we are using docker registry 2.7.1 which is the latest release in Jan 18, 2019.
After scan we found there is some security vulnerabilities for golang crypto.
1 CVE-2020-0601 which is fixed in http://golang.org/issue/36834
2 CVE-2020-7919 which is fixed in http://golang.org/issue/36837
Do you have the plan to upgrade the crypto and release new version?
Thanks

Closing this issue as v2.8.2 is currently the latest release and at the time of writing doesn’t contain any CVEs.


Still getting a popup before each nightly update

Hi,
I have "rust-analyzer.updates.askBeforeDownload": false in my settings, but I still have a popup asking me to update every nightly version.
I think the setting only works for downloading the lang server bin, but maybe it shoult also turn off this one? Or it is bad practice because a reload is needed?

Yup, the nightly update requires the reload of the window, either way, we should ask before doing it otherwise it may lead to sudden unwanted side effects.

Understood :)


component events don't fire

Currently using fastclick with no issues. When I switched to ember-gestures, any components that have an event defined, as in:
export default Component.extend({
   click() { /.../ }
});

don't fire.  Double checking with a CSS outline shows I definitely have area to tap on. I tried click and touchend both don't fire. The rest of buttons and a tags do fire.
This is tested on iOS 9, iPhone 6 mobile safari, debugged using desktop safari on mac. Confirmed on 2 different components.

@optikalefx I need to expand the docs apparently :P
This section specifically, if you have a moment: https://github.com/runspired/ember-gestures#using-touch-action-as-a-fastclick
Your component need to bind the style attribute listed there to the string used in the example.
import Ember from 'ember';

const {
  Component
} = Ember;

const {
  SafeString
} = Ember.Handlebars;

export default Component.extend({
   click() { /.../ },

   attributeBindings: ['style', 'disabled', 'type'],
   style: new SafeString('touch-action: manipulation; -ms-touch-action: manipulation;')

});

Added to docs: https://github.com/runspired/ember-gestures/commit/ad6997072b879543e09e5c9943fb709a2ed8681f

That's super lame isn't it? At a minimum I think you should ship a mixin that can be used in a component. I mean every single component in a mobile app that has an event will need this?

@optikalefx ime / imo using click on a component is an antipattern.  I considered reopening component to add this automatically if click is present (you can still do that), but tbh just using an AST Walker on a Glimmer component is probably the cleanest path forward, we just have to wait for glimmer components to land.  Automatically adding things to attributeBindings is prone to conflicts.
If you want to reopen, do this.
Ember.Component.reopenClass({
  attributeBindings: ['touchActionStyle:style'],
  touchActionStyle: computed(function() {
    return new Ember.Handlebars.SafeString( this.click ? 'touch-action: manipulation; -ms-touch-action: manipulation;' : '' );
  })
});

I'm curious to hear what a better pattern for this setup is. The premise is that this component is a back button. inside of a header component. There are 5 header components that different, and they all use this back button component.

If the click is not inside the component, this work would have to be an action on all 5 inclusions of the component and passed the action from something higher up. A much more convoluted setup I think.

@optikalefx that's a complex question with a complicated answer.
Some of the answer is the complexity of jQuery eventing: https://ember-twiddle.com/847601d7383bc60052b4
Some of the answer is the performance hit that you take when you use jQuery eventing, and the second hit you take when you use Ember's event delegation on top of that.
There is currently no good answer to this question, so for now, sticking with click is the way to go.  Now that ember-gestures is almost to 0.1 and Hammer 2.0.5 is out, I can focus back on finishing https://github.com/runspired/ember-capture-eventing, which contains one possible good answer to this question.

@optikalefx the RFC for which the ember-capture-eventing addon is an experimental playground: https://github.com/emberjs/rfcs/pull/86

@optikalefx after thinking about this a little bit more, I think I'm going to do the reopen in 0.0.9, I'll push it up tomorrow morning.

Alright, I think at least for now, it's the most expected. Maybe most people don't have components that act on themselves like this, but I think it's useful when it comes up

let's keep this open until 0.0.9 is out with that update

0.0.9 is staged and ready, but I'm also locking it to Hammer 2.0.6 which is coming shortly.


composer install fails on cakephp application template

composer require gourmet/social-meta:~1.0
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for gourmet/social-meta ~1.0 -> satisfiable by gourme
t/social-meta[v1.0.0].
- gourmet/social-meta v1.0.0 requires cakephp/cakephp 3.0.*-dev -> no matchi
ng package found.
Potential causes:

A typo in the package name
The package is not available in a stable-enough version according to your min
imum-stability setting
see https://getcomposer.org/doc/04-schema.md#minimum-stability for more det
ails.

Read https://getcomposer.org/doc/articles/troubleshooting.md for further commo
n problems.
Installation failed, reverting ./composer.json to its original content.

Thanks for reporting this. I forgot to tag a new release after updating composer so the 'stable' release wasn't so stable after all.
Everything should be fixed now and composer should stop complaining. Try again! :smile:


Changes to organisation of trading page on mobile

Change 'Trade' tab to 'Charts'

Move order book and trade history component to the market info page and move the price history chart to the charts page.

So the order of market info page is: Market title and info component - outcomes - order book and trade history component - order ticket - comments
Order of charts page: Price history chart - candle sticks and depth chart component - comments
No change to order/positions page
Clickable prototype: https://www.figma.com/proto/fLWVwmanAwetVZbujQquEi/Market-Page?node-id=218%3A23083&viewport=-576%2C-173%2C0.6305556893348694&scaling=scale-down
Designs: https://www.figma.com/file/fLWVwmanAwetVZbujQquEi/Market-Page?node-id=2357%3A2571

Looks much better - closing


feature request: day-view-start/end changeable per binding

Feature request:
i think it would be a good feature to be able to change between 24h/view and work hours.
like so:
calendarConfig.showTimesOnWeekView = true;
day-view-start="{{vm.dayViewStart}}"
but if i use this to swap alter the day-view-start the events are at the incorrect position regarding the times for the week view.
Link to minimally-working plunker that reproduces the issue
http://plnkr.co/edit/KvCr3CIPIfNlehfXITDl?p=preview
Versions
angular-bootstrap-calendar
0.29.2
Angular:
1.5.11
Calendar library:
?
Browser name and version:
chrome - Version 59.0.3071.115 (Official Build) (64-bit)
same on firefox

Thank you for providing plunker with example.
You can manually request the view to refresh:
vm.show24Hours = function() {
  vm.dayViewStart = '00:00';
  vm.dayViewEnd = '23:00';

  $timeout(rv);
};

vm.showOnlyWorkHours = function() {
  vm.dayViewStart = '08:00';
  vm.dayViewEnd = '20:00';

  $timeout(rv);
};

function rv() {
  $scope.$broadcast('calendar.refreshView');
}

Of course you will need to inject $timeout and $scope into your controller.
Plunker: http://plnkr.co/edit/brlQZ0HfXVendG5nr7OA?p=preview


Duplicate jars

IMO having duplicate jars is pretty common for a moderately sized project. with sbt one-jar i get this error. I do not seem to find any help to avoid this.

[error] ...*:one-jar: java.util.zip.ZipException: duplicate entry: lib/slf4j-log4j12-1.6.1.jar

Thanks

Just started playing with sbt-onejar as an alternative to sbt-assembly.  Immediately hit this three year old bug ... Guess I will revisit sbt-onejar again in a few years, as this seems to be the pace of improvement.  sbt-onejar should not die when trying to add multiple identical copies of a jar to a project.


Some video types are not correctly recognized in tdlib

I built a tdlib small application and found that when the video type is .m4v, it is sent through tdlib and the tag type is video, but the telegram server recognizes it as document.
However, I can upload it through telegram’s PC client or mobile APP and it will be displayed as video type after successful upload.
I don't know why

Do you use inputMessageVideo to upload video files?

Do you use inputMessageVideo to upload video files?

Yeah，I use it！
TDLIB version 1.8.29 made a document fix. According to my observation, it should have fixed a recognition problem of video types containing the suffix .MEPG4.
In previous versions, the .mpeg4 video type would also encounter I encountered the same problem.
Now it can be recognized normally.
But .m4v still cannot be recognized normally.
If possible, please fix it in the next version.

Do you use inputMessageVideo to upload video files?

MPEG4,not MEPG4

If you use inputMessageVideo and specify all fields, then it is sent as a video. File extension doesn't matter. Whether an app receiving the video will be able to play it. depends on the target app.


Users - mobile_settings required even if optionnal in API

Dear all,
I guess there is a typo in TF provider.
Indeed, mobile settings are required even if optional in GUI/API.
Best regards,

Thank you for raising this issue @anthosz


Dj create tags

Added the ability to Add tags when creating groups. Displays tags on the explore page. Must click arrow to display more tags when there are more than 4 tags. Can also now edit tags from editpost.js

added component in Edit Study Group to support adding tags too


Allow for executing client to be set dynamically

Preface
First I want to thank you all for implementing a more memory efficient GraphQL client. We are really excited to delete ours. I also really appreciate the light wrapper approach.
Problem
Throughout our application we use the graphql api and one of the first things we noticed was that we needed to check the result object returned from the graphql client to determine if an error occurred. This wasn't something we liked scattered throughout our code and as a result we enhanced the client to parse errors and raise exceptions instead.
However, we appreciate this may not be the approach everyone wants to take. We also really like the lightweight approach. It better enables developers to instrument heuristics they prefer.
Solution
In order to maintain flexibility, respect the light wrapper approach, and enable cleaner code I'd like to propose the ability to set a custom client implementation. As much as this will allow us to easily handle errors without monkey patching, I'm far more excited to use this in our tests.

Signed CLA as requested by this fancy bot.

Thanks for bringing this up @RichardBlair. Completely agreed that we should offer a way to customize the client. There's two issues I can see after a quick look:

what you're calling the "client" is not that accurate since the graphql-client has some confusing concepts in my opinion. It's really the execute "adapter" as they call it. So letting people customize the adapter is useful, but still fairly limited since the adapter doesn't do that much (ref).
we could go one step further and actually allowing customize the client itself instead of the default (GraphQL::Client). Maybe we can come up with a higher-level way to achieve both of these with a single configuration option. Or at a minimum we just allow both to be set separately: client and execute_adapter.

I'll give this another look tomorrow after I think on it more.

The verbiage is very sub-optimal, I agree.  Even "execute" is a bit weird, all the thing does is provide an abstraction for IO. That said, deviating from "execute" will probably just cause more confusion so we should probably stick with that?
One potential issue I see with allowing the client to be set is that there will need to be a defined interface that the client needs to adhere to. At that point I'm not sure there is that much of a benefit to using this library, the developer is already half way to hand rolling this implementation anyway. If this is a none issue though, then I'm all for it.
Personally I like the idea of allowing both to be set. It provides the greatest flexibility while still allowing this codebase to evolve. I'll whip it up and if we decide to go the other way no worries!

Hey gang, curious what the process is for getting this merged and if there is anything else I need to do on my end?

Sorry I was waiting for CI to pass again but it seems stuck. I will try to kick it


Support ES6 + CJS

Coverage remained the same at 88.352% when pulling bce3e347ed2118b5afaf013277a20d7ed76a148a on builds into bc67ba7874f8c7a4db44eef91415f9179249653b on master.


Howdy CLI not working on Ubuntu 18.04

I am looking to setup howdy on Ubuntu Bionic Beaver but the command is not recognized after a successful installation. I am quite confused what the issue might be. It outputs:
howdy: command not found

and when I run whereis howdy, it shows the .gz path

Linux distribution (if applicable): Ubuntu 18.04
Howdy version: 2.5.1

how did you install it? I got this error:
Attempting installation of missing data files
Downloading 3 required data files...
Unpacking...
bzip2: Can't open input file *.bz2: No such file or directory.
Error while running last command

Did you install it from the PPA?

@M0Rph3U56031769 That's a different issue, retry the installation and open a new issue if it persists

This is what I get in an Ubuntu 19.10. It is from the ppa. Dlib compile goes ok. Camera is detected but finally fails to create the execute. Looks like a problem in pip3:
Traceback (most recent call last):
  File "/usr/bin/pip3", line 11, in <module>
    sys.exit(main())
TypeError: 'module' object is not callable
Error while running last command
dpkg: error processing package howdy (--configure):
 installed howdy package post-installation script subprocess returned error exit status 1
Processing triggers for man-db (2.8.7-3) ...
Errors were encountered while processing:
 howdy
E: Sub-process /usr/bin/dpkg returned an error code (1)

@thhart That's also a completely different problem, see #227 and please use the search function if possible
Closing as it's attracting unrelated issues and the OP has not responded

@NtsikaMngoma
I have the same problem ，I've tried to reinstall it many times and still do 。

This worked for me
sudo apt remove howdy
sudo pip3 install --upgrade pip
sudo dpkg --install howdy_2.6.0.deb

great


Undo command

model points to a previous version of TaskBook. Changes not shown on UI. Same for Clear command, when model points to a new empty taskbook, UI is not cleared. Need to investigate more.

@potatowagon Maybe this will fix it?
From: Paul Tan<EMAIL_ADDRESS>Date: Sun, 16 Oct 2016 22:53:26 +0800
Subject: [PATCH] TaskBook::resetData(): replace floating/event/deadline task
 data as well

Despite it's name, TaskBook::resetData() did not actually reset all data
of the task book. Let's fix that.
---
 src/main/java/seedu/address/model/TaskBook.java | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/src/main/java/seedu/address/model/TaskBook.java b/src/main/java/seedu/address/model/TaskBook.java
index f8ee434..dbc2fab 100644
--- a/src/main/java/seedu/address/model/TaskBook.java
+++ b/src/main/java/seedu/address/model/TaskBook.java
@@ -37,26 +37,18 @@ public class TaskBook implements ReadOnlyTaskBook {
      * Tasks are copied into this TaskBook.
      */
     public TaskBook(ReadOnlyTaskBook toBeCopied) {
-        this(toBeCopied.getTasks(),
-             toBeCopied.getFloatingTasks(),
-             toBeCopied.getEventTasks(),
-             toBeCopied.getDeadlineTasks());
+        this();
+        resetData(toBeCopied);
     }

     /**
-     * Tasks are copied into this TaskBook.
+     * Replaces the contents of this TaskBook with {@code newData}.
      */
-    public TaskBook(List<Task> tasks, List<FloatingTask> floatingTasks,
-                    List<EventTask> eventTasks, List<DeadlineTask> deadlineTasks) {
-        this();
-        setTasks(tasks);
-        setFloatingTasks(floatingTasks);
-        setEventTasks(eventTasks);
-        setDeadlineTasks(deadlineTasks);
-    }
-
     public void resetData(ReadOnlyTaskBook newData) {
         setTasks(newData.getTasks());
+        setFloatingTasks(newData.getFloatingTasks());
+        setEventTasks(newData.getEventTasks());
+        setDeadlineTasks(newData.getDeadlineTasks());
     }

     //// task operations

@potatowagon How about this less invasive approach? it takes advantage of the fact that the ModelManager knows whether it has been modified or not, and the LogicManager knows what command it has executed.
diff --git a/src/main/java/seedu/address/logic/LogicManager.java b/src/main/java/seedu/address/logic/LogicManager.java
index afbff7e..2fffaf8 100644
--- a/src/main/java/seedu/address/logic/LogicManager.java
+++ b/src/main/java/seedu/address/logic/LogicManager.java
@@ -34,7 +34,11 @@ public class LogicManager extends ComponentManager implements Logic {
         logger.info("----------------[USER COMMAND][" + commandText + "]");
         Command command = parser.parseCommand(commandText);
         command.setData(model);
-        return command.execute();
+        CommandResult result = command.execute();
+        if (model.hasUncommittedChanges()) {
+            model.commit(commandText);
+        }
+        return result;
     }

     @Override
diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java
index 221a96b..4521d07 100644
--- a/src/main/java/seedu/address/model/Model.java
+++ b/src/main/java/seedu/address/model/Model.java
@@ -109,4 +109,15 @@ public interface Model {
      */
     void setDeadlineTaskFilter(Predicate<? super DeadlineTask> predicate);

+    /// Commit/Rollback
+
+    /** Returns true if there are changes to the model that have not been committed */
+    boolean hasUncommittedChanges();
+
+    /** Commits any uncommitted changes */
+    void commit(String command);
+
+    /** Rollbacks n commits, and returns its command string */
+    String rollback(int n) throws IllegalValueException;
+
 }
diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java
index 0198e2b..31e6a9f 100644
--- a/src/main/java/seedu/address/model/ModelManager.java
+++ b/src/main/java/seedu/address/model/ModelManager.java
@@ -1,5 +1,7 @@
 package seedu.address.model;

+import java.util.ArrayList;
+import java.util.List;
 import java.util.function.Predicate;
 import java.util.logging.Logger;

@@ -28,6 +30,7 @@ public class ModelManager extends ComponentManager implements Model {
     private final FilteredList<FloatingTask> filteredFloatingTasks;
     private final FilteredList<EventTask> filteredEventTasks;
     private final FilteredList<DeadlineTask> filteredDeadlineTasks;
+    private final List<Commit> commits;

     /**
      * Initializes a ModelManager with the given TaskBook
@@ -44,6 +47,8 @@ public class ModelManager extends ComponentManager implements Model {
         this.filteredFloatingTasks = new FilteredList<>(this.taskBook.getFloatingTasks());
         this.filteredEventTasks = new FilteredList<>(this.taskBook.getEventTasks());
         this.filteredDeadlineTasks = new FilteredList<>(this.taskBook.getDeadlineTasks());
+        this.commits = new ArrayList<>();
+        this.commits.add(new Commit("initial commit", taskBook));
     }

     public ModelManager() {
@@ -241,4 +246,41 @@ public class ModelManager extends ComponentManager implements Model {
         filteredDeadlineTasks.setPredicate(predicate);
     }

+    /// Commit/Rollback
+
+    private static class Commit {
+        final String command;
+        final TaskBook taskBook;
+
+        Commit(String command, ReadOnlyTaskBook taskBook) {
+            this.command = command;
+            this.taskBook = new TaskBook(taskBook);
+        }
+    }
+
+    @Override
+    public boolean hasUncommittedChanges() {
+        return !taskBook.equals(commits.get(commits.size() - 1).taskBook);
+    }
+
+    @Override
+    public void commit(String command) {
+        commits.add(new Commit(command, taskBook));
+    }
+
+    @Override
+    public String rollback(int n) throws IllegalValueException {
+        if (n < 0) {
+            throw new IllegalValueException("n must be positive");
+        }
+        int from = commits.size() - n;
+        if (from < 1) {
+            throw new IllegalValueException("not enough commits");
+        }
+        commits.subList(from, commits.size()).clear();
+        Commit currentCommit = commits.get(commits.size() - 1);
+        resetData(currentCommit.taskBook);
+        return currentCommit.command;
+    }
+
 }

hmm  I like the idea of using a commit object to store taskbook and command.
for : 2. not store the full task book for every commit, but only just the differences. -> That is very complicated tho

THE  BUG FIX WORKS :D thanks paul

Everything works fine on the UI, but there is still room for polishing, namely: seeing if taskbook has changes not based on modifiesData() of commands but by the method suggested by Paul. Will have to tweak Pauls method as Redo and Undo, though they modify data, have to pass of as not modify data if not there will be a logic error, which is double record of state

done..........................................................................................zzzzz

This is done by shifting the head label back and forth the commits list, undo shifts head back, redo shifts head forward. A change is commited when :

Taskbook has UncommitedChanges
The change is not cause by Undo or Redo

Thankyou Paul for your suggested method, it is indeed better, problem was i took quite some time to understand it

i will include test in the next pull request

@potatowagon  We now have #125 . Is this PR still needed?

@potatowagon What's the status of this PR?


Compiling individual instances instead of whole page

The page.compile() API seems like it's designed specifically to be used with a page that itself is written in the webc format. This means that any existing (unrelated) scripts and style tags on the page need to have webc:keep added to them to prevent webc from touching them.
It would be nice to be able to tell webc to only compile the files that it finds in the globs passed via defineComponents and ignore the rest of the page. Since webc knows about this list of components ahead of time, this should be possible. 🤔
One very common use case for this is when a global layout file is written in plain html/njk. This might have critical styles and inline scripts that should not be processed by webc.

I just want to make sure you know that we very recently added Bundler Mode as of 0.4 and disabled it by default (though it’s enabled by default in the Eleventy plugin). Did you upgrade to 0.4?
More info at https://github.com/11ty/webc#aggregating-css-and-js

Right, I saw setBundlerMode but I don't think it quite solves this problem.
Here's what I want:

aggregate CSS/JS for component instances

this is useful to prevent duplication and to allow extra bundling steps (e.g. externalizing to a file, applying postcss)

don't touch CSS/JS for the page that uses those components

this makes sense because the page itself is not always a webc component (e.g. could be a page generated by another framework)

If I use setBundlerMode(false), then it fixes 2 but breaks 1.

For more context, I'm making a vite plugin for webc, and I'm currently working around this by manually adding webc:keep to all the unrelated scripts and styles on the page before handing them off to webc.

Ah I know I haven’t really answered your question yet but I wonder if webc:raw would do what you wanted

Ah yeah, webc:raw is probably a better fit for this use case. Still a workaround because I need to add it to non-webc related code, but it works 👍


Add CRAFT to Readme.

Probably too soon as the project doesn't have much traction yet. It would be good to add a link to CRAFT https://github.com/stoyan/craft .
Create React App From Template

Use your own starting point when setting up a new app, e.g. CSS, JS, manifests an such.

Wanted to at least put Craft on the radar.

Doesn't look like this gained traction - closing.


[BEAM-38] Reset Writer in WriteBundles.finishBundle

Be sure to do all of the following to help us incorporate your contribution
quickly and easily:

[x] Make sure the PR title is formatted like:
[BEAM-<Jira issue #>] Description of pull request
[x] Make sure tests pass via mvn clean verify. (Even better, enable
Travis-CI on your fork and ensure the whole test matrix passes).
[x] Replace <Jira issue #> in the title with the actual Jira issue
number, if there is one.
[x] If this contribution is large, please file an Apache
Individual Contributor License Agreement.

This allows the WriteBundles DoFn to be reused.

R: @dhalperi

LGTM, will merge once green.


Refactor the PageHeader component out of the seeds namespace since it is being used in a few places (and I want to use it somewhere else in a future PR). Implemented two new properties: backName and snackbarPageKey which were the only areas that were still specific to seeds/accessions

Current dependencies on/for this PR:

#2189  👈
main

This stack of pull requests is managed by Graphite.


add GetDefinition as intent to be used in future benchmarks

Paul, thanks for your PR. As you might have seen, we've changed a lot in the bench since last time so I thing it became obsolete now.


Buzzer and T-display S3

I am currently trying to use a buzzer to set off an alarm when a certain condition is meat but currently it just activates the buzzer and turns the entire display off and the display will flicker back on when the buzzer activates again. Besides that i have to restart it to get the display back on
if (isCelsius) {
      spr2.drawString("A:" + String(alarmtempc,0), 5, 8, 4);
      if (abs(currentTempc - alarmtempc) <= 1) {
        tone(13, 600, 30);
        noTone(13);
      } else {}
    } else {
      spr2.drawString("A:" + String(alarmtempf,0), 5, 8, 4);
      if (abs(currentTempf- alarmtempf) <= 1) {
        tone(13, 600, 30);
        noTone(13);
      } else {}
    }

We can assume you have set the correct settings in the SETUP section.
Seems like the current draw may be too much on the buzzer. Try running without anything connected to pin I/O13
Could be a brownout

if my mean correct setting in the SETUP by what is below then yes, if not please let me know.
pinMode(13, OUTPUT);
it actually happens without the buzzer attached to the pins, do you know would i would fix this?

I guess you have tried to setup different gpio for buzzer instead of #13.

We are assuming your buzzer has worked before. Two types of buzzer, passive and active. If passive, just putting power to it will note make a noise. See Arduino tone.
Put power in the battery and see if that makes a noise.

If you still have problems, please open it again


Decoupling tabs in the experiment page and display them after validating

Decoupling tabs in the experiment page and display them after validating

The conditional operator hierachy looks good and we need to apply more props check for each tab I think.

The conditional operator hierachy looks good and we need to apply more props check for each tab I think.

Sure, thanks for the review and comment.

@Karoy, please review this PR. My local setup has throwing 8000 port already bind issue when I try to test this PR. I will fix it and test, meanwhile suggest issue local experiment.

Hi both, I improved the code. Please re-review and add your comments.

Good work and I have a few comments listed below:

Code format: we do not use ; to end any javascript code line
In the current implementation, we only check one key and one optionsKey, firstly can you explain what is the difference between these two props? Are they required and non-required? As far as I know, we have more than one required props at least for the Result tab. Please double check the other tabs and add more possible checks.
Given the above issue solved, we should remove the top ribbon fully, not only the ribbon title, here is the screenshot while I tested locally by removing ks from result tab, which may give you some clues about my comment.

Hi @lingyun1010, gathered all the required validation fields to validate and display their corresponding tabs.
Here is the document: Frontend_tab_validations.docx

I had a deeper review and I think it's better to leave some commets asap.

I tested the Results tab props, including ks, ksWithMarkerGenes, metadata, plotTypesAndOptions, defaultPlotMethodAndParameterisation and anatomogram, by setting them as empty individually. As far as what I can see, the props plotTypesAndOptions and defaultPlotMethodAndParameterisation are not working properly. What we expect is if they are empty, we still show the anatomogram tab in Results tab, and the other horizontal tabs too. Please double check it and fix the senario.
In the console, some logs are found but I don't think it's necessary for debugging or reporting, please take a look.

I had a deeper review and I think it's better to leave some commets asap.

I tested the Results tab props, including ks, ksWithMarkerGenes, metadata, plotTypesAndOptions, defaultPlotMethodAndParameterisation and anatomogram, by setting them as empty individually. As far as what I can see, the props plotTypesAndOptions and defaultPlotMethodAndParameterisation are not working properly. What we expect is if they are empty, we still show the anatomogram tab in Results tab, and the other horizontal tabs too. Please double check it and fix the senario.
In the console, some logs are found but I don't think it's necessary for debugging or reporting, please take a look.

3. I made some changes on `TSnePlotViewRoute.js` for inferred cell type marker gene features, please pull the latest develop branch changes and install the latest version packages and also pay attention to the conflicts please.

For point 1:  the props defaultPlotMethodAndParameterisation are not working properly. I have some doubts about showing some existing code issues. Can we have a call around 1:30 pm if you are free  to discuss.


feat(scExpression): added cell count to scExpression

#2696

Reviewers
Functional:
@hthomas-czi
@signechambers1
@seve

@MDunitz can you take a look at the backend changes? Turns out that what I had done previously was incorrect as the joined dataframe that was being iterated through was the output of groupby(...).first(), so it didn't actually capture the total number of cells.


Record codec GUID to identify unknown codec

Related to #2400, I was always wondering what is the unknown codec which has codec id 5 that appears in the log very often.
[2022-10-28T22:04:34.814+0900] [WARN ] xrdp_caps_process_codecs: unknown codec id 5

I added codec GUID to the log in order to identify unknown codecs.  It turned out the one is Image RemoteFX.
[2022-10-29T02:34:55.707+0900] [INFO ] xrdp_caps_process_codecs: NSCodec(CA8D1BB9-000F-154F-589FAE2D1A87E2D6), codec id [1], properties len [3]
[2022-10-29T02:34:55.708+0900] [WARN ] xrdp_caps_process_codecs: unknown(2744CCD4-9D8A-4E74-803C0ECBEEA19C54), codec id [5], properties len [49]
[2022-10-29T02:34:55.710+0900] [INFO ] xrdp_caps_process_codecs: RemoteFX(76772F12-BD72-4463-AFB3B73C9C6F7886), codec id [3], properties len [49]

@matt335672 I'd appreciate it if you review the g_guid_to_string function. It is the only void function in string_calls. Should it return some value?

Hi @metalefty.
I've done some more thinking about this. There may be some mileage in updating guid.c to generate proper UUIDs as specified by RFC4122 section 4.4.
I can look at that as a subsequent PR after this one is merged.

Moved some functions and tests to guid.{c,h}.
Microsoft's GUID is a little bit different from the common UUID.
See: https://devblogs.microsoft.com/oldnewthing/20220928-00/?p=107221
So I created a separate function ms_guid_to_str() to convert MS GUID to string.

One comment added above. Also you're right - I need to fix the GUID generation.