GNOME polishing from Q.A findings

Motivation for this change
Some stuff I thought to fixup when rereading https://github.com/NixOS/nixpkgs/issues/99648
Especially the thing about allowing DE modules to register a flatpak GUI that will be installed automatically.
Though, it's of question if there should be an option to disable that?
Things done

[ ] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[ ] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[x] Fits CONTRIBUTING.md.

It seems https://github.com/NixOS/nixpkgs/pull/101516/commits/bcd186fb143c10e4516a1752530f4f60070c64bb did nothing... maybe we need an internal option for favorite apps

I had to add an option for favorite-apps, but it's internal since it's only for the installation-cd, and it would be better suited to actually have a better dconf module.

Also noticed that gnome-calendar should be in favorites as well https://github.com/NixOS/nixpkgs/pull/101516/commits/7df6af303e78986fa208c84f349afd928874fe62

It should not really matter that the option was there twice, I think the issue were the syntax error (missing comma).

It should not really matter that the option was there twice, I think the issue were the syntax error (missing comma).

I corrected it to no effect. Maybe I should check again, but I believe I tried building vms with clean states each time.


Dycore paper updates in how we compute SHF and LHF

Updates following section 3.6.4 in the dycore paper.
Tests work for me locally when using the Thermodynamics v0.13 branch. This PR should be merged after we do the Thermodynamics release.
cc: @kmdeck - will it affect the land models?

Sorry, none of the tests will work until we have Thermodynamics v0.13, because I put it as a requirement.

@trontrytel In simulations where land is forced by a prescribed atmosphere, land needs to compute its own fluxes. In principle that means we just call SF functions, but instead right now we do that and then adjust the SF fluxes as follows:
https://github.com/CliMA/ClimaLand.jl/blob/a746febe976c4dcab555c2afb8dbbe0483e169b4/src/shared_utilities/drivers.jl#L367-L372
This is actually more similar to the SF computation in this PR, so that is good. We had switched to this form because it was easier to debug/understand than the previous SF computation (e.g. SHF doesnt depend on E). But note that we also need to account for surface resistance in the fluxes, and SF does not handle that right now, so we do it "offline".
To couple the full land model to atmos, we need to adjust SF to account for resistance.  We should also adjust our standalone land model to use the output of SF directly. This will make coupled runs easier to debug.


Post Processing Stack v2 artifacts

Hi, I'm working on porting this over to use the Post Processing Stack v2 API and I'm very close to having something usable. However, it looks like I have some bayer artifacts as you can see in this picture:

Do you know what could be causing them? I have had to change the vertex and uv outputs of the vertex shader to assume the input is in clip space in order to support the v2 stack and I assume the issue has something to do with that, but I am not familiar enough with the v2 stack or your code to figure out where the error is.
The blitting also had to be changed to be compatible, so that may be another source of error.

Hi, it's glad to hear someone is working on migrating to post-processing v2!
Could you put the code or scene with the artifacts?
I use bayer matrix when offsetting the raymarching, to make temporal reprojection better. It does bring some artifacts, but shouldn't be that obvious.
Also, which commit is your branch based on? Lots of code have been changed recently, and they do help to prevent the artifact.

Btw, if you use the original code with your current config, is there any similar artifact?  (Or, are you sure the problem is caused by your edits or the original code behaves the same)

Wow that was a fast reply! My changes are based off of the code from about a week ago, with some of the changes from ~8 hours ago merged in. I'm pretty sure it's my code that's broken as your original code doesn't appear to have the artifacts.
I was attempting to make the transition to v2 in an existing project (which wasn't the best idea) but I'll try to separate it so I can share it.

Ok, I ended up forking the repo and making a StackV2 branch. Not sure if this is the best way to share it, I don't contribute to GitHub projects very often. Also, please forgive the messy shader code. I'm trying to understand both the VolumeCloud code as well as the Stack V2 API at the same time. 😉
I left most of your original code in the branch so you can compare the two by disabling the Post Process Layer on the main camera.

Got it, I'll check it very soon.

Awesome, thanks!

I just replaced the TEXTURExx_SAMPLERxx and SAMPLE_TEXTURE with original sampler2D/tex2D, then it's fixed. Don't know why.
Here's the edited CloudShaderHelperPPSv2.cginc.
Also, I noticed that the cloud rendered is very different between the two methods.  Maybe SAMPLE_TEXTURE and tex2D/tex3D work differently?
I don't know if it's required to use TEXTURExx_SAMPLERxx pattern in pps v2. If it is, maybe we need to find out why this happens.
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
#include "HLSLSupport.cginc"

#define EARTH_RADIUS 6371000.0
#define EARTH_CENTER float3(0, -EARTH_RADIUS, 0)

#define TRANSMITTANCE_SAMPLE_STEP 512.0f

static const float bayerOffsets[3][3] = {
	{0, 7, 3},
	{6, 5, 2},
	{4, 1, 8}
};

TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);

sampler2D _HeightDensity;
sampler3D _BaseTex;
sampler3D _DetailTex;
sampler2D _CurlNoise;
sampler2D _WeatherTex;

//Base shape
float _CloudStartHeight;
float _CloudEndHeight;
float _BaseTile;
//Detal shape
float _DetailTile;
float _DetailStrength;
//Curl distortion
float _CurlTile;
float _CurlStrength;
//Top offset
float _CloudTopOffset;

//Overall cloud size.
float _CloudSize;
//Overall Density
float _CloudOverallDensity;
float _CloudCoverageModifier;
float _CloudTypeModifier;

half4 _WindDirection;
float _WeatherTexSize;

//Lighting
float _ScatteringCoefficient;
float _ExtinctionCoefficient;
float _SilverIntensity;
float _SilverSpread;

float SampleDensity(float3 worldPos, int lod, bool cheap, out float wetness);

float Remap(float original_value, float original_min, float original_max, float new_min, float new_max)
{
	return new_min + (((original_value - original_min) / (original_max - original_min)) * (new_max - new_min));
}

float RemapClamped(float original_value, float original_min, float original_max, float new_min, float new_max)
{
	return new_min + (saturate((original_value - original_min) / (original_max - original_min)) * (new_max - new_min));
}

float HeightPercent(float3 worldPos) {
	float sqrMag = worldPos.x * worldPos.x + worldPos.z * worldPos.z;

	float heightOffset = EARTH_RADIUS - sqrt(max(0.0, EARTH_RADIUS * EARTH_RADIUS - sqrMag));

	return saturate((worldPos.y + heightOffset - _CloudStartHeight) / (_CloudEndHeight - _CloudStartHeight));
}

static float4 cloudGradients[3] = {
	float4(0, 0.07, 0.08, 0.15),
	float4(0, 0.2, 0.42, 0.6),
	float4(0, 0.08, 0.75, 1)
};

float SampleHeight(float heightPercent, float cloudType) {
	float4 gradient;
	float cloudTypeVal;
	if (cloudType < 0.5) {
		gradient = lerp(cloudGradients[0], cloudGradients[1], cloudType*2.0);
	}
	else {
		gradient = lerp(cloudGradients[1], cloudGradients[2], (cloudType - 0.5)*2.0);
	}

	return RemapClamped(heightPercent, gradient.x, gradient.y, 0.0, 1.0)
		* RemapClamped(heightPercent, gradient.z, gradient.w, 1.0, 0.0);
}

float3 ApplyWind(float3 worldPos) {
	float heightPercent = HeightPercent(worldPos);

	// skew in wind direction
	worldPos.xz -= (heightPercent)* _WindDirection.xy * _CloudTopOffset;

	//animate clouds in wind direction and add a small upward bias to the wind direction
	worldPos.xz -= (_WindDirection.xy + float3(0.0, 0.1, 0.0)) * _Time.y * _WindDirection.z;
	worldPos.y -= _WindDirection.z * 0.4 * _Time.y;
	return worldPos;
}

float HenryGreenstein(float g, float cosTheta) {

	float k = 3.0 / (8.0 * 3.1415926f) * (1.0 - g * g) / (2.0 + g * g);
	return k * (1.0 + cosTheta * cosTheta) / pow(abs(1.0 + g * g - 2.0 * g * cosTheta), 1.5);
}

float ApplyCoverageToDensity(float sampleResult, float coverage) {
	sampleResult = RemapClamped(sampleResult, 1.0 - coverage, 1.0, 0.0, 1.0);
	sampleResult *= coverage;
	return sampleResult;
}

float SampleDensity(float3 worldPos, int lod, bool cheap, out float wetness) {
	//Store the pos without wind applied.
	float3 unwindWorldPos = worldPos;

	//Sample the weather map.
	half4 coverageSampleUV = half4((unwindWorldPos.xz / _WeatherTexSize), 0, 2.5);
	coverageSampleUV.xy = (coverageSampleUV.xy + 0.5);
	float3 weatherData = tex2Dlod(_WeatherTex, coverageSampleUV);
	weatherData *= float3(_CloudCoverageModifier, 1.0, _CloudTypeModifier);
	float cloudCoverage = RemapClamped(weatherData.r, 0.0, 1.0, 0.3, 1.0);
	float cloudType = weatherData.b;
	wetness = weatherData.g;

	//Calculate the normalized height between[0,1]
	float heightPercent = HeightPercent(worldPos);
	if (heightPercent <= 0.0f || heightPercent >= 1.0f)
		return 0.0;

	//Sample base noise.
	fixed4 tempResult;
	worldPos = ApplyWind(worldPos);
	tempResult = tex3Dlod(_BaseTex, half4(worldPos / _CloudSize * _BaseTile, lod)).rgba;
	float low_freq_fBm = (tempResult.g * .625) + (tempResult.b * 0.25) + (tempResult.a * 0.125);
	float sampleResult = RemapClamped(tempResult.r, 0.0, .1, .0, 1.0);	//perlin-worley
	sampleResult = RemapClamped(low_freq_fBm, -0.5 * sampleResult, 1.0, 0.0, 1.0);

	//Sample Height-Density map.
	float2 densityAndErodeness = tex2Dlod(_HeightDensity, float4(cloudType, heightPercent, 0.0, 0.0)).rg;

	sampleResult *= densityAndErodeness.x;
	//Clip the result using coverage map.
	sampleResult = ApplyCoverageToDensity(sampleResult, cloudCoverage);

	if (!cheap) {
		float2 curl_noise = tex2Dlod(_CurlNoise, float4(unwindWorldPos.xz / _CloudSize * _CurlTile, 0.0, 1.0)).rg;
		worldPos.xz += curl_noise.rg * (1.0 - heightPercent) * _CloudSize * _CurlStrength;

		float3 tempResult2;
		tempResult2 = tex3Dlod(_DetailTex, half4(worldPos / _CloudSize * _DetailTile, lod)).rgb;
		float detailsampleResult = (tempResult2.r * 0.625) + (tempResult2.g * 0.25) + (tempResult2.b * 0.125);
		//Detail sample result here is worley-perlin fbm.

		//On cloud marked with low erodness, we see cauliflower style, so when doing erodness, we use 1.0f - detail.
		//On cloud marked with high erodness, we see thin line style, so when doing erodness we use detail.
		float detail_modifier = lerp(1.0f - detailsampleResult, detailsampleResult, densityAndErodeness.y);
		sampleResult = RemapClamped(sampleResult, min(0.8, detail_modifier * _DetailStrength), 1.0, 0.0, 1.0);
	}

	//sampleResult = pow(sampleResult, 1.2);
	return max(0, sampleResult) * _CloudOverallDensity;
}

float _MultiScatteringA;
float _MultiScatteringB;
float _MultiScatteringC;

//We raymarch to sun using length of pattern 1,2,4,8, corresponding to step value.
//First sample(length 1) should sample at length 0.5, meaning an average inside length 1.
//Second sample should sample at 1.5, meaning an average inside [1, 2],
//Third should sample at 3.0, which is [2, 4]
//Forth at 6.0, meaning [4, 8]
static const float shadowSampleDistance[5] = {
	0.5, 1.5, 3.0, 6.0, 12.0
};

static const float shadowSampleContribution[5] = {
	1.0f, 1.0f, 2.0f, 4.0f, 8.0f
};

float SampleOpticsDistanceToSun(float3 worldPos) {
	int mipmapOffset = 0.5;
	float opticsDistance = 0.0f;
	[unroll]
	for (int i = 0; i < 5; i++) {
		half3 direction = _WorldSpaceLightPos0;
		float3 samplePoint = worldPos + direction * shadowSampleDistance[i] * TRANSMITTANCE_SAMPLE_STEP;
		float wetness;
		float sampleResult = SampleDensity(samplePoint, mipmapOffset, true, wetness);
		opticsDistance += shadowSampleContribution[i] * TRANSMITTANCE_SAMPLE_STEP * sampleResult;
		mipmapOffset += 0.5;
	}
	return opticsDistance;
}

float SampleEnergy(float3 worldPos, float3 viewDir) {
	float opticsDistance = SampleOpticsDistanceToSun(worldPos);
	float result = 0.0f;
	float cosTheta = dot(viewDir, _WorldSpaceLightPos0);
	[unroll]
	for (int octaveIndex = 0; octaveIndex < 2; octaveIndex++) {	//Multi scattering approximation from Frostbite.
		float transmittance = exp(-_ExtinctionCoefficient * pow(_MultiScatteringB, octaveIndex) * opticsDistance);
		float ecMult = pow(_MultiScatteringC, octaveIndex);
		float phase = lerp(HenryGreenstein(.1f * ecMult, cosTheta), HenryGreenstein((0.99 - _SilverSpread) * ecMult, cosTheta), 0.5f);
		result += phase * transmittance * _ScatteringCoefficient * pow(_MultiScatteringA, octaveIndex);
	}
	return result;
}

//Code from https://area.autodesk.com/blogs/game-dev-blog/volumetric-clouds/.
bool ray_trace_sphere(float3 center, float3 rd, float3 offset, float radius, out float t1, out float t2) {
	float3 p = center - offset;
	float b = dot(p, rd);
	float c = dot(p, p) - (radius * radius);

	float f = b * b - c;
	if (f >= 0.0) {
		float dem = sqrt(f);
		t1 = -b - dem;
		t2 = -b + dem;
		return true;
	}
	return false;
}

bool resolve_ray_start_end(float3 ws_origin, float3 ws_ray, out float start, out float end) {
	//case includes on ground, inside atm, above atm.
	float ot1, ot2, it1, it2;
	bool outIntersected = ray_trace_sphere(ws_origin, ws_ray, EARTH_CENTER, EARTH_RADIUS + _CloudEndHeight, ot1, ot2);
	if (!outIntersected || ot2 < 0.0f)
		return false;	//you see nothing.

	bool inIntersected = ray_trace_sphere(ws_origin, ws_ray, EARTH_CENTER, EARTH_RADIUS + _CloudStartHeight, it1, it2);

	if (inIntersected) {
		if (it1 * it2 < 0) {
			//we're on ground.
			start = max(it2, 0);
			end = ot2;
		}
		else {
			//we're inside atm, or above atm.
			if (ot1 * ot2 < 0) {		//Inside atm.
				if (it1 > 0.0) {
					//Look down.
					end = it1;
				}
				else {
					//Look up.
					end = ot2;
				}
				start = 0.0f;
			}
			else {			//Outside atm
				if (ot1 < 0.0) {
					return false;
				}
				else {
					start = ot1;
					end = it1;
				}
			}
		}
	}
	else {
		end = ot2;
		start = max(ot1, 0);
	}
	return true;
}

struct RaymarchStatus {
	float intensity;
	float depth;
	float depthweightsum;
	float intTransmittance;
};

void InitRaymarchStatus(inout RaymarchStatus result) {
	result.intTransmittance = 1.0f;
	result.intensity = 0.0f;
	result.depthweightsum = 0.00001f;
	result.depth = 0.0f;
}

void IntegrateRaymarch(float3 startPos, float3 rayPos, float3 viewdir, float stepsize, inout RaymarchStatus result) {
	float wetness;
	float density = SampleDensity(rayPos, 0, false, wetness);
	if (density <= 0.0f)
		return;
	float extinction = _ExtinctionCoefficient * density;

	float clampedExtinction = max(extinction, 1e-7);
	float transmittance = exp(-extinction * stepsize);

	float luminance = SampleEnergy(rayPos, viewdir) * lerp(1.0f, 0.3f, wetness);
	float integScatt = (luminance - luminance * transmittance) / clampedExtinction;
	float depthWeight = result.intTransmittance;		//Is it a better idead to use (1-transmittance) * intTransmittance as depth weight?

	result.intensity += result.intTransmittance * integScatt;
	result.depth += depthWeight * length(rayPos - startPos);
	result.depthweightsum += depthWeight;
	result.intTransmittance *= transmittance;
}

Interesting. The reason for those TEXTURExx_SAMPLERxx was that the custom effects wiki page said it should be used for compatibility with the other render pipelines.
I'll try that code out and see if I can figure out the remaining differences.

Ah, I think the difference was that the stack v2 effect didn't have the hierarchical height map enabled but the original did. Checking the box and using that code snippet, they now look pretty much identical to me.
Since it's "technically working" I'll push it to my fork in case anyone wants to reference it in the future. Not sure if it's in a good enough condition that you would want to merge it, but it's good enough for my purposes. Thanks.

Cool, I'll close the issue then.
Later I might merge your code for supporting HDRP, thank you for your contribution. :D


Horizontal line number widget & vertical line number widget auto-hide (like focus mode).

I suggest implementing two features:

a widget showing the first row's line number, which would be right under the tabs widget and then one at the bottom, right before the status line, showing the last visible line number. This could be enabled instead of the vertical line number widget, where each line is numbered to save horizontal space for your screen and code editor(s). I find this crucial as I need to know the line numbers, usually rare, but for navigation, this would certainly help to know where you are approximate.
Another feature is auto-hiding the horizontal line number widget. This would allow us, again, to save horizontal space for editors. We can probably show the widget when we are scrolling through the file and hide it when we are typing or not scrolling (navigating the lines within the visible area of the editor). Another option when to show it when it is hidden is to have a hotkey like "shift" or "control" or "alt" or something else like that which state can toggle the widget visibility on and off: when this key is pressed we can see the numbers, when it is not pressed, we can't.

Both of these proposed features would be nice to have as an option, so with on/off toggles in the configuration.

This feature request has not yet received the 20 community upvotes it takes to make to our backlog. 10 days to go. To learn more about how we handle feature requests, please see our documentation.
Happy Coding!

:slightly_frowning_face: In the last 60 days, this feature request has received less than 20 community upvotes and we closed it. Still a big Thank You to you for taking the time to create this issue! To learn more about how we handle feature requests, please see our documentation.
Happy Coding!


Couldn't able to add lcpl files

I am getting the following error while uploading the lcpl files
[2]   progress: 100,
[2]   downloadedSize: 286872,
[2]   status: 4 } +688ms
[2]   readium-desktop:main#services/catalog Parse publication - START C:\Users...\AppData\Local\Temp\readium-desktop-41840izPQMppOOYcL.part +1ms
[2] [xmldom warning]    attribute "U/?-??" missed value!! "U/?-??" instead2!!
[2] @#[line:1,col:10]
[2] [xmldom error]      element parse error: Error: invalid attribute:U/?-??
[2] @#[line:1,col:10]
[2] [xmldom error]      element parse error: Error: invalid tagName:jyW?-^
[2] @#[line:1,col:66]
[2] [xmldom warning]    attribute "??<D!cd??????:?8?x???" missed value!! "??<D! cd??????:?8?x???" instead2!!
[2] @#[line:3,col:149]
[2] [xmldom error]      element parse error: Error: invalid attribute:??<D!cd?? ????:?8?x??? [2] @#[line:3,col:149] [2] [xmldom error]      element parse error: Error: invalid tagName:D!cd??????:
?8?x???
[2] @#[line:3,col:162]
[2]   readium-desktop:main#redux/sagas/api TypeError: Cannot read property 'chil
dNodes' of null
[2]   readium-desktop:main#redux/sagas/api     at d.properties.forEach (C:\Users
....\readium-desktop-develop\readium-desktop-develop\node_modules\r2-utils-js
dist\es6-es2015\src_utils\xml-js-mapper\methods\deserialize.js:117:45)
[2]   readium-desktop:main#redux/sagas/api     at Map.forEach ()
[2]   readium-desktop:main#redux/sagas/api     at definitions.forEach (C:\Users
...\readium-desktop-develop\readium-desktop-develop\node_modules\r2-utils-js\d
ist\es6-es2015\src_utils\xml-js-mapper\methods\deserialize.js:27:22)
[2]   readium-desktop:main#redux/sagas/api     at Array.forEach ()
[2]   readium-desktop:main#redux/sagas/api     at deserializeRootObject (C:\User
s...\readium-desktop-develop\readium-desktop-develop\node_modules\r2-utils-js
\dist\es6-es2015\src_utils\xml-js-mapper\methods\deserialize.js:19:17)
[2]   readium-desktop:main#redux/sagas/api     at Object.deserialize (C:\Users\1
5728\readium-desktop-develop\readium-desktop-develop\node_modules\r2-utils-js\di
st\es6-es2015\src_utils\xml-js-mapper\methods\deserialize.js:7:12)
[2]   readium-desktop:main#redux/sagas/api     at Function.deserialize (C:\Users
...\readium-desktop-develop\readium-desktop-develop\node_modules\r2-utils-js
dist\es6-es2015\src_utils\xml-js-mapper\xml.js:9:30)
[2]   readium-desktop:main#redux/sagas/api     at Object. (C:\Users\1
5728\readium-desktop-develop\readium-desktop-develop\node_modules\r2-shared-js\d
ist\es6-es2015\src\parser\epub.js:294:43)
[2]   readium-desktop:main#redux/sagas/api     at Generator.next ()
[2]   readium-desktop:main#redux/sagas/api     at fulfilled (C:\Users...\read
ium-desktop-develop\readium-desktop-develop\node_modules\tslib\tslib.js:104:62)
[2]   readium-desktop:main#redux/sagas/api     at process._tickCallback (interna
l/process/next_tick.js:68:7) +33s

In order to debug this, we will need access to either the LCPL file (or alternatively the encrypted EPUB file with the META-INF/license.lcpl already injected inside), or better even: the non-encrypted / plain-text EPUB file :)
Thank you!

Please find the lcpl file
Thank you
Sent from my iPhone

On 10-Jul-2019, at 11:00 PM, Daniel Weck<EMAIL_ADDRESS>wrote:
PS: you can write to me in private if you would like to share confidential information.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or mute the thread.

This error is due to the LCP server encrypting the NCX/NavDoc and the CoverImage (which is not LCP-compliant). The bug was fixed in the master branch:
https://github.com/readium/readium-lcp-server/tree/master


Ambiguous reference between DataTables.Blazor.Column and Bootstrap Blazor component libraries

You may want to rename your "Column" component to "DTColumn" or something like that, otherwise if people are using other libraries that have a Column component (i.e. Blazorise, etc) they'll get an ambiguous error like:

Obviously one can specify the type further (Blazorise.Column, DataTables.Blazor.Column), but perhaps that's not the best experience.
Thanks for the component library!

I'd thought this earlier today. One day MSFT will implement aliasing for components...
As there seem to be a few users now it might be worth doing.

@soenneker - if you update to version 3.0.0 of the library created in https://github.com/JustinWilkinson/DataTables.Blazor/pull/15 I have renamed the Column component DataTableColumn.
Hopefully this will reduce the risk of naming clashes for you 😄

Thank you! Much appreciated. I completely agree about the blazor alias issue.
https://github.com/dotnet/aspnetcore/issues/13090


Discord Emoji's

Please answer the following questions.
Which version of matterbridge are you using?
version: 0.16.0-dev
If you're having problems with mattermost please specify mattermost version.
Please describe the expected behavior.
Matterbridge should default emoji's from discord to text :smile: or :)
Please describe the actual behavior.
Matterbridge is trying to send emoji's through plaintext? not sure.. even the logs show an actual smiley face lol. Mattermost doesn't like this for some reason, but slack is okay with it.
DEBU[2017-06-26T22:45:35Z] Sending config.Message{Text:"testing 😄", Channel:"tron", Username:"Infernoman", UserID:"", Avatar:"https://cdn.discordapp.com/avatars//e2dd4f0d0d5fb7dd1766e174bdb84837.jpg", Account:"discord.tron", Event:"", Protocol:"", Gateway:"tron", Timestamp:time.Time{sec:63634113935, nsec:865441026, loc:(*time.Location)(0x1042cc0)}} from discord.tron (tron) to mattermost.tron (tron)

DEBU[2017-06-26T22:45:35Z] Receiving config.Message{Text:"testing 😄", Channel:"tron", Username:"Infernoman<discord>", UserID:"", Avatar:"https://cdn.discordapp.com/avatars//e2dd4f0d0d5fb7dd1766e174bdb84837.jpg", Account:"discord.tron", Event:"", Protocol:"discord", Gateway:"tron", Timestamp:time.Time{sec:63634113935, nsec:865441026, loc:(*time.Location)(0x1042cc0)}}  module=mattermost

INFO[2017-06-26T22:45:36Z] unexpected status code: 500                   module=mattermost
unexpected status code: 500

DEBU[2017-06-26T22:45:36Z] Sending config.Message{Text:"testing 😄", Channel:"tron", Username:"Infernoman", UserID:"", Avatar:"https://cdn.discordapp.com/avatars/210547344955932672/e2dd4f0d0d5fb7dd1766e174bdb84837.jpg", Account:"discord.tron", Event:"", Protocol:"", Gateway:"tron", Timestamp:time.Time{sec:63634113935, nsec:865441026, loc:(*time.Location)(0x1042cc0)}} from discord.tron (tron) to slack.hobby (tron)

DEBU[2017-06-26T22:45:36Z] Receiving config.Message{Text:"testing 😄", Channel:"tron", Username:"Infernoman<discord>", UserID:"", Avatar:"https://cdn.discordapp.com/avatars//e2dd4f0d0d5fb7dd1766e174bdb84837.jpg", Account:"discord.tron", Event:"", Protocol:"discord", Gateway:"tron", Timestamp:time.Time{sec:63634113935, nsec:865441026, loc:(*time.Location)(0x1042cc0)}}  module=slack

Any steps to reproduce the behavior?
send an emoji on discord
Please add your configuration file
(be sure to exclude or anonymize private data (tokens/passwords))
[irc]
    [irc.freenode]
        Server="irc.freenode.net:6667"
        Nick="CRW-MatterBridge"
        PrefixMessagesWithNick=true
        IgnoreNicks="travis-ci"

[slack]
    [slack.hobby]
        useAPI=true
        Token="TOKEN"
        EditSuffix=" (edited on slack)"

[mattermost]
    [mattermost.general]
        BindAddress="<IP_ADDRESS>:9999"
        URL="URL"
        EditSuffix=" (edited on mattermost)"

    [mattermost.tron]
        BindAddress="<IP_ADDRESS>:9988"
        URL="URL"
        EditSuffix=" (edited on mattermost)"

[discord]
    [discord.general]
        Token="TOKEN"
        WebhookURL="URL"
        Server="Crown"
        EditSuffix=" (edited on discord)"

    [discord.tron]
        Token="TOKEN"
        WebhookURL="URL"
        Server="Crown"
        EditSuffix=" (edited on discord)"

# General Channel
[[gateway]]
name="general"
enable=true
    [[gateway.inout]]
    account="irc.freenode"
    channel="#crowncoin"

    [[gateway.inout]]
    account="mattermost.general"
    channel="town-square"

    [[gateway.inout]]
    account="slack.hobby"
    channel="general"

    [[gateway.inout]]
    account="discord.general"
    channel="general"

# tron Channel
[[samechannelgateway]]
   name="tron"
   enable = true
   accounts = [ "discord.tron","mattermost.tron","slack.hobby" ]
   channels = [ "tron" ]

I cut down the config to just the channels in question. All public channels are now using a webhook for both discord and mattermost and slack.hobby to relay to slack. 14 channels in total.

It also appears that it does not relay to IRC either.

See #127
I'm not going to fix this, I can't even reproduce this, smileys sent from discord show as smileys in mattermost and irc.
Discord converts :smile: to unicode and sends it to mattermost which shows it correctly.

What version of mattermost do you use ?

Alright found the issue finally. Discord sends unicode by default and the webhook server (at least the one i have) doesnt like unicode for text. after switching to https://gowalker.org/github.com/wangii/emoji and using UnicodeToEmojiTag I was able to fix this issue :)


Portable A/C Support

Per https://github.com/simbaja/ha_gehome/issues/31#issuecomment-894901134, this is the start of the discussion for getting Portable A/C unit support into the SDK.
@luddystefenson, please let me know if I can help further.

I think this is working correctly. Let me know what else I can do or if I messed something up running the example script.
2021-08-16 22:42:52,260 DEBUG    Getting OAuth2 token
2021-08-16 22:42:52,277 DEBUG    Client changed state: GeClientState.INITIALIZING to GeClientState.AUTHORIZING_OAUTH
2021-08-16 22:42:54,896 DEBUG    Getting WS credentials
2021-08-16 22:42:54,896 DEBUG    Client changed state: GeClientState.AUTHORIZING_OAUTH to GeClientState.AUTHORIZING_CLIENT
2021-08-16 22:42:55,338 INFO     Starting GE Appliances client
2021-08-16 22:42:55,360 DEBUG    Client changed state: GeClientState.AUTHORIZING_CLIENT to GeClientState.CONNECTING
2021-08-16 22:42:55,445 DEBUG    client - state = CONNECTING
2021-08-16 22:42:55,581 DEBUG    client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x0000016F1A77EEE0>)
2021-08-16 22:42:55,582 DEBUG    client > GET /?access_token=ue1cpmmffdewz71aht5tedqfj11rq2qy HTTP/1.1
2021-08-16 22:42:55,582 DEBUG    client > Headers([('Host', 'ws-us-east-1.brillion.geappliances.com'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', 'PS2BoqNuo9Yy1SQ9zJD2/A=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('User-Agent', 'Python/3.9 websockets/9.1')])
2021-08-16 22:42:55,794 DEBUG    client - event = data_received(<212 bytes>)
2021-08-16 22:42:55,794 DEBUG    client < HTTP/1.1 101 Switching Protocols
2021-08-16 22:42:55,794 DEBUG    client < Headers([('Date', 'Tue, 17 Aug 2021 04:42:56 GMT'), ('Connection', 'upgrade'), ('upgrade', 'websocket'), ('sec-websocket-accept', 'Nf9sCdYKOMRE/lYDlc8jehDgkqE='), ('sec-websocket-extensions', 'permessage-deflate')])
2021-08-16 22:42:55,795 DEBUG    client - state = OPEN
2021-08-16 22:42:55,795 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#subscribe", "action": "subscribe", "resources": ["/appliance//erd/"]}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:55,796 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance", "id": "List-appliances"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:55,797 DEBUG    Client changed state: GeClientState.CONNECTING to GeClientState.CONNECTED
2021-08-16 22:42:55,905 DEBUG    client - event = data_received(<49 bytes>)
2021-08-16 22:42:55,906 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#subscribe","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,073 DEBUG    client - event = data_received(<263 bytes>)
2021-08-16 22:42:56,074 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"List-appliances","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance"},"success":true,"code":200,"body":{"kind":"appliance#applianceList","userId":"ih27f273459ubyd","items":[{"applianceId":"D828C93ADB81","type":"Portable AC","brand":"Unknown","jid":"d828c93adb81_ih27f273459ubyd","nickname":"Portable AC","online":"ONLINE","onlineTime":"2021-08-14T21:58:35.000Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,075 DEBUG    D828C93ADB81 marked available
2021-08-16 22:42:56,075 DEBUG    Adding appliance D828C93ADB81
2021-08-16 22:42:56,075 DEBUG    Requesting update for client D828C93ADB81
2021-08-16 22:42:56,075 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,076 DEBUG    Requesting features for client D828C93ADB81
2021-08-16 22:42:56,076 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,077 DEBUG    Registering update callback for GeAppliance(D828C93ADB81) (Unknown Type)
2021-08-16 22:42:56,252 DEBUG    client - event = data_received(<16 bytes>)
2021-08-16 22:42:56,253 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#connect","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,307 DEBUG    client - event = data_received(<234 bytes>)
2021-08-16 22:42:56,307 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"46","time":"2021-08-17T03:49:43.938Z"},{"erd":"0x7A0F","value":"00","time":"2021-08-17T01:41:27.350Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:42:56,309 DEBUG    Setting ErdCode.MODEL_NUMBER to APWA12YZBW
2021-08-16 22:42:56,309 DEBUG    Setting ErdCode.SERIAL_NUMBER to
2021-08-16 22:42:56,309 DEBUG    Setting ErdCode.TEMPERATURE_UNIT to ErdMeasurementUnits.IMPERIAL
2021-08-16 22:42:56,309 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.PORTABLE_AIR_CONDITIONER
2021-08-16 22:42:56,310 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.UNKNOWN
2021-08-16 22:42:56,310 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-16 22:42:56,310 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to <IP_ADDRESS>
2021-08-16 22:42:56,311 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to <IP_ADDRESS>
2021-08-16 22:42:56,311 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-16 22:42:56,311 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to <IP_ADDRESS>
2021-08-16 22:42:56,311 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to <IP_ADDRESS>
2021-08-16 22:42:56,312 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-16 22:42:56,312 DEBUG    Setting ErdCode.AC_TARGET_TEMPERATURE to 64
2021-08-16 22:42:56,312 DEBUG    Setting ErdCode.AC_FAN_SETTING to ErdAcFanSetting.LOW
2021-08-16 22:42:56,312 DEBUG    Setting ErdCode.AC_OPERATION_MODE to ErdAcOperationMode.COOL
2021-08-16 22:42:56,313 DEBUG    Setting ErdCode.AC_AMBIENT_TEMPERATURE to 70
2021-08-16 22:42:56,313 DEBUG    Setting ErdCode.AC_POWER_STATUS to ErdOnOff.OFF
2021-08-16 22:42:56,313 DEBUG    Setting ErdCode.SAC_AVAILABLE_MODES to ErdSacAvailableModes(has_heat=False, has_dry=True, has_eco=False, raw_value='02')
2021-08-16 22:42:56,313 DEBUG    Setting 0x7B0B to b'\x0e'
2021-08-16 22:42:56,314 DEBUG    Got initial appliance type for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:42:56,314 DEBUG    Appliance state change detected in GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.TEMPERATURE_UNIT, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.AC_TARGET_TEMPERATURE, ErdCode.AC_FAN_SETTING, ErdCode.AC_OPERATION_MODE, ErdCode.AC_AMBIENT_TEMPERATURE, ErdCode.AC_POWER_STATUS, ErdCode.SAC_AVAILABLE_MODES, 0x7B0B
2021-08-16 22:42:56,314 DEBUG    Appliance state change detected in GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:42:56,350 DEBUG    client - event = data_received(<42 bytes>)
2021-08-16 22:42:56,351 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","features":[]}}', rsv1=False,
rsv2=False, rsv3=False)
2021-08-16 22:42:56,351 DEBUG    Received features [] for D828C93ADB81
2021-08-16 22:42:56,440 DEBUG    client - event = data_received(<50 bytes>)
2021-08-16 22:42:56,440 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"resource":"/appliance//erd/","kind":"websocket#subscription","success":true,"change":"ADDED"}', rsv1=False,
rsv2=False, rsv3=False)
2021-08-16 22:43:15,799 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'~:\xb4G', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:15,853 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:43:15,854 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'~:\xb4G', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:15,854 DEBUG    client - received solicited pong: 7e3ab447
2021-08-16 22:43:25,801 DEBUG    Sending keepalive ping
2021-08-16 22:43:25,801 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:25,874 DEBUG    client - event = data_received(<28 bytes>)
2021-08-16 22:43:25,875 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:35,867 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\xbbNlB', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:35,925 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:43:35,926 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\xbbNlB', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:35,926 DEBUG    client - received solicited pong: bb4e6c42
2021-08-16 22:43:55,814 DEBUG    Sending keepalive ping
2021-08-16 22:43:55,814 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:55,890 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:43:55,891 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:55,942 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\xfa\x8d\xbc\x14', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:56,000 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:43:56,000 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\xfa\x8d\xbc\x14', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:56,000 DEBUG    client - received solicited pong: fa8dbc14
2021-08-16 22:43:56,085 DEBUG    Requesting update for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:43:56,085 DEBUG    Requesting update for client D828C93ADB81
2021-08-16 22:43:56,085 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:43:56,368 DEBUG    client - event = data_received(<25 bytes>)
2021-08-16 22:43:56,369 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"46","time":"2021-08-17T03:49:43.938Z"},{"erd":"0x7A0F","value":"00","time":"2021-08-17T01:41:27.350Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:16,009 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\x1cX\x11\xaf', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:16,063 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:44:16,064 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\x1cX\x11\xaf', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:16,064 DEBUG    client - received solicited pong: 1c5811af
2021-08-16 22:44:25,826 DEBUG    Sending keepalive ping
2021-08-16 22:44:25,826 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:25,900 DEBUG    client - event = data_received(<7 bytes>)
2021-08-16 22:44:25,900 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:36,067 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\xee\x9d\xea2', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:36,124 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:44:36,124 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\xee\x9d\xea2', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:36,124 DEBUG    client - received solicited pong: ee9dea32
2021-08-16 22:44:55,836 DEBUG    Sending keepalive ping
2021-08-16 22:44:55,836 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:55,906 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:44:55,906 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:56,109 DEBUG    Requesting update for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:44:56,109 DEBUG    Requesting update for client D828C93ADB81
2021-08-16 22:44:56,109 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:56,110 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'S\xf5 (', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:56,270 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:44:56,270 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'S\xf5 (', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:44:56,270 DEBUG    client - received solicited pong: 53f52028
2021-08-16 22:44:58,007 DEBUG    client - event = data_received(<24 bytes>)
2021-08-16 22:44:58,007 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"46","time":"2021-08-17T03:49:43.938Z"},{"erd":"0x7A0F","value":"00","time":"2021-08-17T01:41:27.350Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:16,276 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\x03J0\x03', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:16,336 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:45:16,336 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\x03J0\x03', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:16,337 DEBUG    client - received solicited pong: 034a3003
2021-08-16 22:45:25,848 DEBUG    Sending keepalive ping
2021-08-16 22:45:25,848 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:25,920 DEBUG    client - event = data_received(<7 bytes>)
2021-08-16 22:45:25,921 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:36,346 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\xbe:\xd2\xfc', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:36,401 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:45:36,401 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\xbe:\xd2\xfc', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:36,402 DEBUG    client - received solicited pong: be3ad2fc
2021-08-16 22:45:55,870 DEBUG    Sending keepalive ping
2021-08-16 22:45:55,870 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:55,945 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:45:55,945 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:56,109 DEBUG    Requesting update for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:45:56,109 DEBUG    Requesting update for client D828C93ADB81
2021-08-16 22:45:56,109 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:56,332 DEBUG    client - event = data_received(<24 bytes>)
2021-08-16 22:45:56,332 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"46","time":"2021-08-17T03:49:43.938Z"},{"erd":"0x7A0F","value":"00","time":"2021-08-17T01:41:27.350Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:56,412 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'3\xd8\xc5\xb0', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:56,466 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:45:56,467 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'3\xd8\xc5\xb0', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:45:56,467 DEBUG    client - received solicited pong: 33d8c5b0
2021-08-16 22:46:16,468 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'<\xadl\x8e', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:16,522 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:46:16,523 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'<\xadl\x8e', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:16,523 DEBUG    client - received solicited pong: 3cad6c8e
2021-08-16 22:46:25,877 DEBUG    Sending keepalive ping
2021-08-16 22:46:25,877 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:25,950 DEBUG    client - event = data_received(<7 bytes>)
2021-08-16 22:46:25,951 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:36,539 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\x9c\xcc\x0e1', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:36,593 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:46:36,593 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\x9c\xcc\x0e1', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:36,594 DEBUG    client - received solicited pong: 9ccc0e31
2021-08-16 22:46:55,878 DEBUG    Sending keepalive ping
2021-08-16 22:46:55,878 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:55,950 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:46:55,950 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:56,118 DEBUG    Requesting update for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-16 22:46:56,118 DEBUG    Requesting update for client D828C93ADB81
2021-08-16 22:46:56,118 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:56,318 DEBUG    client - event = data_received(<24 bytes>)
2021-08-16 22:46:56,318 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"46","time":"2021-08-17T03:49:43.938Z"},{"erd":"0x7A0F","value":"00","time":"2021-08-17T01:41:27.350Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:56,596 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'@\xd53{', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:56,650 DEBUG    client - event = data_received(<6 bytes>)
2021-08-16 22:46:56,650 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'@\xd53{', rsv1=False, rsv2=False, rsv3=False)
2021-08-16 22:46:56,651 DEBUG    client - received solicited pong: 40d5337b

Thanks for this!  Good news is that it looks like (at least for your unit) that there are no additional codes to identify and that it probably works similarly to the other A/C units.  I should be able to get this into the dev branch pretty quickly and we can see how it works in HA.

Exciting! Hope to see it soon, tag me whenever you need me to test it. 👍🙌

I think I pretty much have the support built into the HA component.  One thing I'd like to double check though is metric units.  Can you put your device into metric (celsius) and then re-run the example?  I would only need the log up until here:
2021-08-16 22:42:56,314 DEBUG Got initial appliance type for GeAppliance(D828C93ADB81)

(basically need the erd values settings).  It looks like the portable AC is very close to the split AC, but the split AC was essentially hardcoded internally to only use imperial units.  So, just want to make sure I understand the behavior of these units.  Thanks for the help!

OK, initial HA support has been added to the latest pre-release in the other repository (v0.4.3-dev4).  Once you confirm the imperial/metric behavior, I think I can finalize it.  Let me know how it looks for you.

The imperial/metric setting doesn't work in the native GE Appliances app, it briefly shows the metric readout then switches itself back to imperial. I ran the websocket_example.py script while parked on the settings page with the setting on metric but it still shows imperial for the TEMPERATURE_UNIT.
The AC unit itself does ding though when toggling the metric/imperial switch, indicating somekind of connectivity working there. It just doesn't change it on the AC unit display itself.
Looked at the manuals for the unit, it shows nothing for being able to switch between imperial and metric on the unit itself physically. Nothing obvious on it that could do it.
Here's the log anyways, with the AC unit running and after I switched the toggle, to make it ding. Maybe it will have something.
I'll test the v0.4.3-dev4 release shortly!
2021-08-17 20:52:38,792 DEBUG    Getting OAuth2 token
2021-08-17 20:52:38,810 DEBUG    Client changed state: GeClientState.INITIALIZING to GeClientState.AUTHORIZING_OAUTH
2021-08-17 20:52:40,605 DEBUG    Getting WS credentials
2021-08-17 20:52:40,606 DEBUG    Client changed state: GeClientState.AUTHORIZING_OAUTH to GeClientState.AUTHORIZING_CLIENT
2021-08-17 20:52:40,798 INFO     Starting GE Appliances client
2021-08-17 20:52:40,820 DEBUG    Client changed state: GeClientState.AUTHORIZING_CLIENT to GeClientState.CONNECTING
2021-08-17 20:52:40,903 DEBUG    client - state = CONNECTING
2021-08-17 20:52:41,030 DEBUG    client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x000001D3B246B700>)
2021-08-17 20:52:41,031 DEBUG    client > GET /?access_token=ue1cpbcfstcb4z6uo4y3y0yysrqohv0m HTTP/1.1
2021-08-17 20:52:41,031 DEBUG    client > Headers([('Host', 'ws-us-east-1.brillion.geappliances.com'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', '+MTUUUQ0CTYF3GiQGCJeHQ=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('User-Agent', 'Python/3.9 websockets/9.1')])
2021-08-17 20:52:41,288 DEBUG    client - event = data_received(<212 bytes>)
2021-08-17 20:52:41,289 DEBUG    client < HTTP/1.1 101 Switching Protocols
2021-08-17 20:52:41,289 DEBUG    client < Headers([('Date', 'Wed, 18 Aug 2021 02:52:41 GMT'), ('Connection', 'upgrade'), ('upgrade', 'websocket'), ('sec-websocket-accept', 'zdN7P5kgQqEypYGwXYYzLYigkiE='), ('sec-websocket-extensions', 'permessage-deflate')])
2021-08-17 20:52:41,290 DEBUG    client - state = OPEN
2021-08-17 20:52:41,291 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#subscribe", "action": "subscribe", "resources": ["/appliance//erd/"]}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,291 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance", "id": "List-appliances"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,292 DEBUG    Client changed state: GeClientState.CONNECTING to GeClientState.CONNECTED
2021-08-17 20:52:41,393 DEBUG    client - event = data_received(<49 bytes>)
2021-08-17 20:52:41,394 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#subscribe","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,530 DEBUG    client - event = data_received(<16 bytes>)
2021-08-17 20:52:41,530 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#connect","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,628 DEBUG    client - event = data_received(<263 bytes>)
2021-08-17 20:52:41,628 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"List-appliances","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance"},"success":true,"code":200,"body":{"kind":"appliance#applianceList","userId":"ih27f273459ubyd","items":[{"applianceId":"D828C93ADB81","type":"Portable AC","brand":"Unknown","jid":"d828c93adb81_ih27f273459ubyd","nickname":"Portable AC","online":"ONLINE","onlineTime":"2021-08-14T21:58:35.000Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,629 DEBUG    D828C93ADB81 marked available
2021-08-17 20:52:41,629 DEBUG    Adding appliance D828C93ADB81
2021-08-17 20:52:41,629 DEBUG    Requesting update for client D828C93ADB81
2021-08-17 20:52:41,630 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/erd", "id": "D828C93ADB81-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,631 DEBUG    Requesting features for client D828C93ADB81
2021-08-17 20:52:41,631 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C93ADB81/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,631 DEBUG    Registering update callback for GeAppliance(D828C93ADB81) (Unknown Type)
2021-08-17 20:52:41,875 DEBUG    client - event = data_received(<52 bytes>)
2021-08-17 20:52:41,875 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"resource":"/appliance//erd/","kind":"websocket#subscription","success":true,"change":"ADDED"}', rsv1=False,
rsv2=False, rsv3=False)
2021-08-17 20:52:41,878 DEBUG    client - event = data_received(<235 bytes>)
2021-08-17 20:52:41,878 DEBUG    client - event = data_received(<42 bytes>)
2021-08-17 20:52:41,878 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C93ADB81-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","items":[{"erd":"0x0001","value":"0A415057413132595A4257000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0002","value":"0000000000000000000000000000000000000000000000000000000000000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0007","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0008","value":"16","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0035","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0099","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0102","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0103","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x0105","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7003","value":"0040","time":"2021-08-15T10:03:55.858Z"},{"erd":"0x7A00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A01","value":"00","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7A02","value":"44","time":"2021-08-17T05:35:45.814Z"},{"erd":"0x7A0F","value":"01","time":"2021-08-18T02:50:50.492Z"},{"erd":"0x7B00","value":"02","time":"2021-08-14T22:00:40.854Z"},{"erd":"0x7B0B","value":"0E","time":"2021-08-14T22:00:40.854Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-17 20:52:41,879 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C93ADB81/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"ih27f273459ubyd","applianceId":"D828C93ADB81","features":[]}}', rsv1=False,
rsv2=False, rsv3=False)
2021-08-17 20:52:41,880 DEBUG    Setting ErdCode.MODEL_NUMBER to APWA12YZBW
2021-08-17 20:52:41,880 DEBUG    Setting ErdCode.SERIAL_NUMBER to
2021-08-17 20:52:41,880 DEBUG    Setting ErdCode.TEMPERATURE_UNIT to ErdMeasurementUnits.IMPERIAL
2021-08-17 20:52:41,881 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.PORTABLE_AIR_CONDITIONER
2021-08-17 20:52:41,881 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.UNKNOWN
2021-08-17 20:52:41,881 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-17 20:52:41,882 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to <IP_ADDRESS>
2021-08-17 20:52:41,882 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to <IP_ADDRESS>
2021-08-17 20:52:41,883 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-17 20:52:41,883 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to <IP_ADDRESS>
2021-08-17 20:52:41,883 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to <IP_ADDRESS>
2021-08-17 20:52:41,883 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-17 20:52:41,884 DEBUG    Setting ErdCode.AC_TARGET_TEMPERATURE to 64
2021-08-17 20:52:41,884 DEBUG    Setting ErdCode.AC_FAN_SETTING to ErdAcFanSetting.LOW
2021-08-17 20:52:41,884 DEBUG    Setting ErdCode.AC_OPERATION_MODE to ErdAcOperationMode.COOL
2021-08-17 20:52:41,884 DEBUG    Setting ErdCode.AC_AMBIENT_TEMPERATURE to 68
2021-08-17 20:52:41,885 DEBUG    Setting ErdCode.AC_POWER_STATUS to ErdOnOff.ON
2021-08-17 20:52:41,885 DEBUG    Setting ErdCode.SAC_AVAILABLE_MODES to ErdSacAvailableModes(has_heat=False, has_dry=True, has_eco=False, raw_value='02')
2021-08-17 20:52:41,885 DEBUG    Setting 0x7B0B to b'\x0e'
2021-08-17 20:52:41,885 DEBUG    Got initial appliance type for GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-17 20:52:41,886 DEBUG    Appliance state change detected in GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.TEMPERATURE_UNIT, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.AC_TARGET_TEMPERATURE, ErdCode.AC_FAN_SETTING, ErdCode.AC_OPERATION_MODE, ErdCode.AC_AMBIENT_TEMPERATURE, ErdCode.AC_POWER_STATUS, ErdCode.SAC_AVAILABLE_MODES, 0x7B0B
2021-08-17 20:52:41,886 DEBUG    Appliance state change detected in GeAppliance(D828C93ADB81) (ErdApplianceType.PORTABLE_AIR_CONDITIONER)
2021-08-17 20:52:41,887 DEBUG    Received features [] for D828C93ADB81

OK, seems similar to the split A/C units then.  Internally, it never switches from imperial.  However, on that unit, the actual display on the unit at least switches.  My guess is that they never expected that function to be needed, but had to enable it since the split units are used mainly in Europe and Asia so they kinda made it work.  Thanks for confirming!  I think that dev4 should be good then pending confirmation on that too.

It works! All functions tested...
Turning off/on
Setting temp
Setting mode (Dry, fan, cool)
Setting fan speed!
Only weird thing is that it allows me to set the fan to auto and the temperature to ranges that the unit cannot meet. It does set the temp setting readout to red if I set it out of range though. If I set the fan to auto it just does nothing.
Other than that, it works great. Super responsive. Super cool.

Only weird thing is that it allows me to set the fan to auto and the temperature to ranges that the unit cannot meet. It does set the temp setting readout to red if I set it out of range though. If I set the fan to auto it just does nothing.

Right now, the min/max temperatures are basically inherited from the Split A/C, which allows 60-86.  For the portable units, what are the min/max temperatures allowed, is it 64-86?  Also, just to confirm - there's no Auto setting for the Fan?  It's just Low, Medium, and High?

Fan is just Low, Med and High yeah. Min-Max is 64-86 yup!
Another oddity I noticed would be that Homekit with the Climate exposed to it shows the AC of which I am able to control temperature but has no options for the fan. Perhaps that's just a limitation of Homekit/HomeAssistant though!

OK, can you give -dev5 a shot?  I think the temperature ranges should be updated, and both operation mode and fan mode have been adjusted to exclude "Auto".
I'm not sure what's going on with Homekit, I'm guessing it's a limitation of some sort since I think I've got HA support done in the official way.  Let me know if you see anything in some documentation that says that you have to do something special to get more than AC in Homekit and I can try to make those changes too.

Temperature limitations are now within spec, auto mode is gone as it should be! Perfect.
Here is two screenshots, one of my officially homekit supported thermostat for my whole home, the other of the HomeAssistant Climate integration from here. I'll look into it a bit and see if there is any way to correct this, I imagine it's not this way for just this unit too, where it lacks the controls for modes.

Sounds good let me know what you find out.  Hopefully, there's something simple that can be done to fully enable homekit support.

Had a couple minutes and looked into the source for the homekit integration, and it looks like they are mapping dry and fan only all to "cool", see: https://github.com/home-assistant/core/blob/6d0ce814e79b72b13e8f2eff371e926ddba155ee/homeassistant/components/homekit/type_thermostats.py#L110
So, it looks like this might be by design and a limitation of homekit?

Closing with the assumption that it's a HomeKit limitation, feel free to re-open if you find otherwise or if you run into any other functionality issue.


InstrumentationKey should not be needed if connectionString is already present

I am already providing the connectionString in the config, which I thought it was enough for it to work

But the app throws an error expecting the instrumentationKey property also to be added

Im using the following versions
    "@microsoft/applicationinsights-angularplugin-js": "^2.9.1",
    "@microsoft/applicationinsights-web": "~2.8.2",

Event if you provide a connectionString configuration, it MUST include an instrumentationKey (as part of the connection string).
I believe that is what is triggering this error, for development purposes include either a dummy "looking" instrumentationKey (in the connection string) or just add something like "testInstrumentationKey" and disable the instrumentation key validation by adding disableInstrumentationKeyvalidation: true to you configuration.
However, a better option would be to have a 2nd Azure Monitor account which is used only for testing and use that connection string / key so that you can validate that your system is configured correctly. And for development purposes (if your targetting a browser environment) you can install the Chrome Debug Extension so that you can more easily see the data being sent (even if you are using a dummy instrumentation key)

I was already including the instrumentation key as part of the connection string, and I was getting the error anyway.
To get around the console error, now I am including the actual instrumentation key also in the instrumentationKey property.
But I didn't like that approach I am following because now I had to maintain the correct instrumentation key in two settings/properties. Or so I thought, but from your comment, am I assuming correctly that I can have a dummy key in the instrumentationKey property as long as the correct key is in the connection string?
But I think I like better the idea of setting disableInstrumentationKeyValidation to true. So I can just maintain the correct key in the connection string only and get rid of the dummy one at instrumentationKey property.
Did I understand that correctly?
Thanks for the Chrome Extension, I will check that out.

Yes, but you should not need the instrumentationKey in the config at all, here is where the connection string is parsed and it will effectively "replace" any istrumentationKey https://github.com/microsoft/ApplicationInsights-JS/blob/master/AISKU/src/Initialization.ts#L185-L190
However, what I did notice as part of finding this code is that the instrumentationkey in the connection string "MUST" be all lowercase (not capital "K" for the Key)
The "validation" of the instrumentation key doesn't happen until the "Sender" is initialized which (should be <- not tested as part of this response) after the above code as the above IS the code that starts the entire initialization of the extensions.

Oh I see, problem was that I copied the connection string as shown in the Azure Portal. With the key names in pascal case.

The code you referenced also has the ingestionendpoint all in lower case, different from the Azure Portal.

Ok I just noticed that the parseConnectionString function has a toLowerCase() applied to they key name, so it should not matter if my connections string had uppercase in it. I think I am making a mistake somewhere else in my code.  I think the plug in is working as expected. Thanks for your help.
https://github.com/microsoft/ApplicationInsights-JS/blob/b14bb3360d7cf4de64e010296c986dbcfc2b887c/shared/AppInsightsCommon/src/ConnectionStringParser.ts#L22


Will not compile in Rust Beta due to box syntax

Rust Beta channel will not compile unstable features, and I guess box syntax is an unstable feature.
/_____/_______/.cargo/git/checkouts/elmesque-5da8cd150d113b6f/master/src/lib.rs:12:1: 12:44 error: unstable feature
/_____/_______/.cargo/git/checkouts/elmesque-5da8cd150d113b6f/master/src/lib.rs:12 #![feature(box_patterns, box_syntax, core)]
                                                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: this feature may not be used in the beta release channel
error: aborting due to previous error
Build failed, waiting for other jobs to finish...
Could not compile `elmesque`.

Ahh yes, I've been meaning to get around to stabilising elmesque (removing usage of unstable features) but haven't yet had a chance - if someone's keen to do it (should be pretty easy) i'd be more than happy to merge it! Otherwise i'll get around to it soon :+1:


Rename pickups to activities at code/file level

What does this PR do?
This is part of https://github.com/yunity/karrot-frontend/issues/1127.
It only implements the code/file level changes such that the whole site should look/work as before.
It also is made to work with the existing backend names (/api/pickup...), with the idea we can merge this as soon as possible and then incrementally work on the rest later.

Branch deployment URL --> https://rename-pickups-to-activities.dev.karrot.world/

I wonder if we should keep a list of small manual modifications to be done after we ran the script?

There's no manual modifications :) Here is the script.

I started a rough review and noticed lots of small things - I guess some of them could be changed in master so that the script works better. The rest could be added to the script then?

Ah, interesting you found things, especially if lots! If you add a comment for the first example of a category of error, I can look into them...

Ah, good points! Will fix it up...

I think this should be OK now. I fixed all the ones you mentioned, plus a few more I think.

I can review maybe tomorrow afternoon or Friday, but I'm also happy if you merge now. I would have another look when I have some quiet time.
Are there any active PRs that might be hard to rebase once this is merged?


No Edge Boxes if useHtmlLabels=false

The Background Boxes are not rendered correct if html Labels are false.
Only the first one is shown, all other have no rect on edge labels.

The error is in:
var label = labels[i];
should be:
var label = labels[k];

can not reproduce, its a long time ago.
in file flowRenderer.js Line 459
ther is the wrong index var of the for loop

flowchart.htmlLabels by default is false. So mermaid live editor is also using a false value.
It is better if you can reproduce.
But I do see the code you pointed out, that code is very likely wrong. Nice catch.

Confirmed, the bug was introduced in https://github.com/knsv/mermaid/commit/ab398c64a826120b37adcd6be974211dda1683c5#diff-2d1e5c0548ca8417cc597b345f914aa2L513
Thanks!


Update zhongyun_controller.cc

Add mode.

@Gavin-Tao I am closing all your commits. As communicated earlier, please check into master head and we'll do the cherry picking to 5.5 branch. And if possible, please combine your commits into a single or fewer pull requests. Thank you again for your contribution.


[1.11.2] Turbine elements not showing in creative tab

A couple turbine elements do not show up in the creative tab and in JEI. They are craftable if you know the recipe for it.

Fixed!


principle behind severity?

This is probably the wrong place to ask questions like this but I didn't find another place.
Severity can be rated in 3 levels. It looks very similar to TMT priority.
What exactly is the practical use of severity?
From a classical risk oriented approach a priority is similar to a resulting risk with different levels before and after mitigation. Before mitigation it helps to prioritize activities applying countermeasures.
Risk is defined as a product of impact and likelihood if you want to simplify. Impact in my opinion is simply characterized by sensitivity of the data processed in the data flow and broken SLA. Both are different (business) impacts to be referenced to the character of the STRIDE attack vector. The other dimension likelihood is just a guess how easy it is to materialize the threat.
If possible I try to setup likelihood and impact based on the companies risk definition and throw out the risk level as a result.
Using priority TMT had the "problem" that it was setup by guessing not having a basis with risk assessment. Therefore it produced no real value for me. I changed it to calculate risks in a spreadsheet instead of prioritizing within TMT.
It would be helpful to know what the reason is for implementing severity this way.

Yes, very good point @dschadt . When using TD within our company it is a very subjective evaluation, and can mean different things to different dev teams - so it is good to discuss what is meant by it and what it perhaps should be.
I have created a channel in the OWASP slack, #project-threat-dragon , which would be a good place to have these discussions.  Did you want to join the channel and open the discussion?

I would be very proud if I can help and support the community.
I do have some more questions about the methodologies to be integrated in TD, e. g. STRIDE per element vs interaktion or better combine?
What do I have to do to join a channel?

Hello Dirk - it would be very good to have you in these discussions. You can join the OWASP slack at owasp.slack.com using your @owasp.org email address. When you are in then join various channels, such as #project-threat-dragon and #threat-modeling .
If you do not have an OWASP member email address, I think I can add you to a single channel as a guest ... although this will be the first time I have tried it :-)  I will need your email address, can I use the one on your github profile?

Migrated to new issue in the OWASP area repo : https://github.com/OWASP/threat-dragon-core/issues/7


format-toml doesnt keep dependency taplo-cli consistent across machines

Describe The Bug
I had a old version of taplo-cli installed, and was encountering a different toml formatting locally vs CI, where the latest version is always being installed by install_crate because it is missing.
To Reproduce

Manually install https://crates.io/crates/taplo-cli/0.1.0 and cargo-make
Run cargo make format-toml with a toml file that includes very long lines, e.g.

sbp = { git = "https://github.com/swift-nav/libsbp.git", rev = "ce5e3d14ae4284c53982bc3fd79a2fa15976ff9f", features = [
  "json",
  "swiftnav-rs",
] }

View the toml
On a machine without taplo-cli or cargo-make installed, install cargo-make
Run cargo make format-toml again
Notice the toml is different

@jayvdb there is no such guarantee that same version is going to be installed on different machines by default.
by default i install the latest available version.
if you want a specific version, in your custom makefile.toml add the following:
[tasks.format-toml]
install_crate = { crate_name = "taplo-cli", binary = "taplo", test_arg = ["--help"], version = "0.1.0" }

naturally you can change to any version you want.
i don't want to have something like pinned versions in the cargo-make tomls since it will make me update those each time.

@jayvdb did you check my solution?

Yes, I can override the install_crate in order to have a predictable version.
That doesnt feel like an optimal solution, as then all projects using this task need to do this instead of it being done once here, and users are not given a clue that they need to do this.
This appears to be roughly the same problem as https://github.com/rust-lang/cargo/issues/6196 or https://github.com/rust-lang/cargo/issues/2267, but there is no shortage of open issues about the general problem area.
I understand your concern about doing bin dep version management here, so maybe while waiting for a cargo solution, perhaps version::check could check for updates of these bin deps as well as checking for new versions of cargo-make.
Or a preinstalled task could be provided that does these checks, so that projects can add this check task to their default checks so that their users will be notified if they are using older tools than CI will install.

cargo make works very similar to a user.
user wants to run some command, its not there, they install it.
once its there, they run it.
next time, they just run it.
checking updates each time, would mean perf hit and also lots of instabilities (lets say bugs creep in).
if you want specific version, i give you this ability, but by default i would think most people would find it unexpected.
i get your use case, but i feel, most of the time, it would work better as it is.
i can say, that cargo-watch i do use specific version (its installed if you use the watch=true attribute) and therefore i'm stuck on an older one which causes people to open issues why specific flags are not available.

I've created two tasks to our Makefile.toml for keeping developers local deps updated, using https://crates.io/crates/cargo-update
[tasks.rustup-update]
command = "rustup"
args = ["update", "stable"]

[tasks.cargo-make-deps-update]
dependencies = ["rustup-update"]
install_crate = { crate_name = "cargo-update", binary = "cargo-install-update", test_arg = [
  "-V",
], min_version = "7.0.1" }
command = "cargo"
args = ["install-update", "taplo-cli", "cargo-make"]

Then we make cargo-make-deps-update a dep of the format-toml task.

nice. are you sure cargo make can update while running?

I am sure it can not, but this seemed like an opportune spot to keep it updated, and hopefully avoid it being a source of confusion due to differences between developer machines.
Any chance cargo-make might add support for cargo-update similar to above.  Note that many deps can be added to the cargo-update args, and only those already installed will be updated by default, so you could use
args = ["install-update", "taplo-cli", "wasm-pack", "md-inc", "cargo-hublish"] to ensure all cargo-make unpinned deps are updated if they have been installed previously.
Also do you happen to know if it is possible to specify only cargo-make deps for rustup update.. ?

cargoakr is extendable, so I'm not sure i want to add that task in.
however, you could create a makefile just for those type of tasks and load it in all your different projects as external dependency (see load scripts) which means it would atill be centralized for you, no matter what project you are working on.


Feature: using vuejs-router

Hello,
I want to make a Blog, with the vuejs router. So I thought to fork this branch and integrate the vuejs router into it.
Do you see any disadvantages using the router for a blog-page (seo).
Is the work worth the better user usability?

If you're still interested in your question, you should read about vue-meta. It should solve your problems

Or use NuxtJs I'm sure you'll like it :)

thank you for the help .
On Thu, Feb 1, 2018 at 9:43 PM, Kouceyla<EMAIL_ADDRESS>wrote:

Or use NuxtJs I'm sure you'll like it :)
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/Vuedo/vuedo/issues/42#issuecomment-362362383, or mute
the thread
https://github.com/notifications/unsubscribe-auth/ARgCSYkZbMvrAW0Pdzqln_oLX46tmStvks5tQgXVgaJpZM4O0Bcu
.


Add a feature for setting and saving a default theme for the editor.

There is a default theme already in the theme configs, but it never changes. It would be cool if the user didn't have to reset their theme every time they reloaded the editor.

Hi, this seems like an interesting issue, can you please assign to me so I work on that?

@zer0link for sure, message me if you have any difficulties. The feature is brand new and I haven't fully thought out how it will be continually integrated.

Thanks for the assignment, @SethWalkeroo ,
I tried to run the steps in readme, and I played around with the color schemes and restarting the editor a couple of times. It seems to remember the last color scheme I am using.
Maybe I misunderstood the issue here, can you show me a step by step to reproduce the issue?

@zer0link Oh, looks like there is a problem with loading the default theme. If you open up the editor again and try entering some syntax, you will notice that the syntax is in the theme of Gruvbox, which is the default theme at the moment. I forgot to initialize the rest of the theme, I will work on that now.

@zer0link Alright, the default theme should load up the same every time you launch the editor now.

Yes, I can see everytime I restarted the editor, it uses the default theme (Gruvbox)

I just realized how dumb it is to have a default theme when the theme saves all by itself. Forget this issue. I don't know where my head was at.

Hi, can I know if the issue is still open?

@zer0link No, sorry, this issue is now closed. I've added the default theme setting to the editor.


Videos on CCTV.com only download 270p

DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

[X] I understand that I will be blocked if I intentionally remove or skip any mandatory* field

Checklist

[X] I'm reporting a new site support request
[X] I've verified that I have updated yt-dlp to nightly or master (update instructions)
[X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
[X] I've checked that none of provided URLs violate any copyrights or contain any DRM to the best of my knowledge
[X] I've searched known issues and the bugtracker for similar issues including closed ones. DO NOT post duplicates
[X] I've read the guidelines for opening an issue
[ ] I've read about sharing account credentials and am willing to share it if required

Region
China
Example URLs
https://tv.cctv.com/2024/05/31/VIDEK4FKgdmofTTqOwGlGffy240531.shtml
Provide a description that is worded well enough to be understood
Videos on CCTV.com only download 270p
Provide verbose output that clearly demonstrates the problem

[X] Run your yt-dlp command with -vU flag added (yt-dlp -vU <your command line>)
[ ] If using API, add 'verbose': True to YoutubeDL params instead
[X] Copy the WHOLE output (starting with [debug] Command-line config) and insert it below

Complete Verbose Output
C:\WINDOWS\system32>yt-dlp -vU "https://tv.cctv.com/2024/05/31/VIDEK4FKgdmofTTqOwGlGffy240531.shtml"
[debug] Command-line config: ['-vU', 'https://tv.cctv.com/2024/05/31/VIDEK4FKgdmofTTqOwGlGffy240531.shtml']
[debug] Encodings: locale cp950, fs utf-8, pref cp950, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version<EMAIL_ADDRESS>from yt-dlp/yt-dlp [12b248ce6] (win_x86_exe)
[debug] Python 3.8.10 (CPython AMD64 32bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg N-102618-ge41255cddb (setts), ffprobe 6.0-essentials_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.20.0, brotli-1.1.0, certifi-2024.02.02, mutagen-1.47.0, requests-2.32.2, sqlite3-3.35.5, urllib3-2.2.1, websockets-12.0
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1820 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version<EMAIL_ADDRESS>from yt-dlp/yt-dlp
yt-dlp is up to date<EMAIL_ADDRESS>from yt-dlp/yt-dlp)
[CCTV] Extracting URL: https://tv.cctv.com/2024/05/31/VIDEK4FKgdmofTTqOwGlGffy240531.shtml
[CCTV] VIDEK4FKgdmofTTqOwGlGffy240531: Downloading webpage
[CCTV] 5f2b782a34e345d3a809ff67308f6e63: Downloading JSON metadata
[CCTV] 5f2b782a34e345d3a809ff67308f6e63: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, size, br, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 5f2b782a34e345d3a809ff67308f6e63: Downloading 1 format(s): hls-460
[debug] Invoking hlsnative downloader on "https://hls.cntv.cdn20.com/asp/hls/450/0303000a/3/default/5f2b782a34e345d3a809ff67308f6e63/450.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 153
[download] Destination: 《海峡两岸》 20240531 [5f2b782a34e345d3a809ff67308f6e63].mp4
[debug] File locking is not supported. Proceeding without locking
[download]  26.8% of ~  90.64MiB at    5.25MiB/s ETA 00:14 (frag 42/153)

I have the same problem.

I have the same problem.

I have the same problem

Here's a patch for the issue, the resolution correspond to "流畅，标清，高清，超清" on cctv website.
cctv.patch

            # PATCH BEGIN ---
            for res in ["450", "850", "1200", "2000"]:
                hls_qurl = re.sub(r"main", res, hls_url)
                format = self._extract_m3u8_formats(
                    hls_qurl,
                    video_id,
                    "mp4",
                    entry_protocol="m3u8_native",
                    m3u8_id="hls",
                    fatal=False,
                )
                formats.extend(format)
            # PATCH END   ---

@by-justin Unfortunately this patch doesn't work for sports.cctv.com. Let's take the recent Paris 2024 Opening Ceremony as an example: https://sports.cctv.com/2024/07/27/VIDEXQn0oFQgo9Ls3b1IDF3m240727.shtml
Extracted m3u8 urls from this patch are: https://hls.cntv.cdn20.com/asp/hls/<resolution-code>/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/<resolution-code>.m3u8
where  can be 450, 850, 1200, 2000.
However they give a 403 Forbidden response whether I use a proxy or not (for the original video example in the issue, it does work with a proxy).
I also tried hls_url from a response JSON, ...

https://hls.cntv.lxdns.com/asp/hls/main/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/main.m3u8\?maxbr\=2048 (hls_url value)
https://hls.cntv.lxdns.com/asp/hls/450/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/450.m3u8 (unwrapped from 1)

...changing 450 to 2000 for url 2, but with no luck - the video is still 480x270.
So seems all these alternative CDN URLs can't be used anymore for higher resolutions? If looking directly at the browser's "Network" panel, ts files are fetched from, like: https://dh5aliwx01.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/664.ts, which is encrypted, and I heard of CCTV is using WASM to decrypt them. I'm just curious, is there any possibility that the decryption algorithm can be reverse-engineered? Thus we can stop using these alternative CDN URLs.

Try this url
https://hlssnap.video.cctv.com/asp/hls/2000/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/2000.m3u8

Try this url https://hlssnap.video.cctv.com/asp/hls/2000/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/2000.m3u8

Oops thanks! This works. Any generic way to extract this URL? Will appreciate it.

Try this url https://hlssnap.video.cctv.com/asp/hls/2000/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/2000.m3u8

Oops thanks! This works. Any generic way to extract this URL? Will appreciate it.

https://www.bilibili.com/read/cv39584729/

Try this url https://hlssnap.video.cctv.com/asp/hls/2000/0303000a/3/default/e0f483dd28bf4eca827f023dadc5a4e1/2000.m3u8

Oops thanks! This works. Any generic way to extract this URL? Will appreciate it.

https://www.bilibili.com/read/cv39584729/

Thanks for the info, however the post seems to be unavailable and no archived page can be found. Is the method in the page viable enough to be a PR and get merged into yt-dlp?

I wrote that article on bilibili and didn't realize it was reported just 4 hours later.
这篇文章是我在B站写的，但是我没想到它4个小时之后就被人举报了。

Sooner or later the domain hlssnap.video.cctv.com will also expire, I'll create a new gist dedicated to collecting available downloadable domains.
hlssnap.video.cctv.com这个域名早晚有一天也会失效，我建立一个新gist，专门收集可用的下载域名。
https://gist.github.com/u9sky/8c3a24e5514244f406751a839da39e9e


cffi: typedef shmem_{ctx|team}_t as an opaque struct type

This allows for OpenSHMEM implementations declaring ctx/team types as either a pointer types or an integral types.
Declaring shmem_{ctx|team}_t as an opaque struct type has an annoying side-effect: now ctx/team handles can no longer be compared for equality. Therefore, add a couple auxiliary functions eq_{ctx|team} to compare handles for equality. Additionally, in case we need them in the future, add functions to convert to/from integer values.

@jeffhammond I managed to find a way to address our Cray issue, albeit at the expense of slightly uglier implementation code in the Python side.

the complex stuff is a hack.  i haven't tried to fix it.


Fix emission of Slurm's --exclusive flag

Also added the associated unit tests to avoid future regressions.
Fixes #127.

@jenkins-cscs retry daint kesch leone monch


How to Use SideNav as an Actual Router Linked Page based on Click

Bug, feature request, or proposal:
This is more of a question
What is the expected behavior?
When using a side nave... I want to toggle the sidenav open and have information that would otherwise be a link from a router i.e. //some-page/employee-id1/department2
to go to the corresponding linked information... in this case a prepopulated form page
Are there methods or properties for this to access?
What is the current behavior?
N/A
What are the steps to reproduce?
N/A
Providing a Plunker (or similar) is the best way to get the team to see your issue.
Plunker template: https://goo.gl/DlHd6U
What is the use-case or motivation for changing an existing behavior?
Using a modal popup isn't always the best user experience.  A sidenav that is half the page works nicely on getting information infront of the end user and allow that to slide back off of the screen when they are finished
Which versions of Angular, Material, OS, browsers are affected?
2.4.8+, 2.0.0-beta-2, Mac sierre
Is there anything else we should know?
Nope

put router-outlet in it?

@fxck why would that work?  the url isn't or hans't been changed

@xtianus79, since this is question rather than a bug report / feature request, it really belongs on stack overflow, gitter, or similar. If you post a question on SO and link to it from here, I can try to help you there.
FWIW, if I understand your question, maybe ActivatedRoute can help you achieve what you're after.

@willshowell thank you.  I am testing a few things and if I come to the point of needing it I will post this on SO... I looked at ActivateRoute and that might be useful/what I need. I was thinking perhaps I don't need this routed at all... (rework you know)  I will do a little investigation first.  thanks

@willshowell I accomplished what i wanted by simply not using the route for anything.  This is what happens in recode life I guess.  I found that the end result was better suited as a modal or slider.  I know in router's you can still use a route for a popup type router link that would extrapolate url info but in this case I just didn't think it was necessary...
I used ngSwitch case to use different components depending on what action on the parent page I wanted to pursue.  Worked out well.


Society Checking - 22881 - Nukumanu

Songs 3743 and 3744 have lat-lons that are very far from the Nukumanu Islands.
Correction: reassign these 2 songs to society 23123 (Ontong Java) and change song lat-lon to -5.27, 159.35.
Reasoning: Looking at the original coding sheets, Nukumanu had been written as the culture name and then crossed out. Instead, both sheets say "Solomon Islands (Lord Howe)." Currently, the song lat-lon is at Lord Howe Island, between Australia and New Zealand, but I think what was meant was Lord Howe Atoll, also known as Ontong Java Atoll, which is in the Solomon Islands, near Nukumanu.

Suggestions implemented


Update Ember-CLI to 1.13.13

no issue
TODO:

[x] update ember-cli
ic-ajax => ember-ajax (should be a separate PR)

@kevinansfield I looked into switching ic-ajax to ember-ajax, and I got a good ways into it, but it also involves a lot more changes than I think are in the scope of this PR. I can work on finishing up the switch and just submit another PR.

:+1:  Agreed, the ember-ajax switch can definitely be a separate PR.
Can you remove the crossdomain.xml and robots.txt files? They're not used at all when the admin app is served through the ghost process so it's probably confusing to keep them around.

Also, this will want bumping to 1.13.13 :wink: I think it's only loader.js and ember-cli-sri version bumps.

Quick ping - would you mind rebasing this when you get a moment? Excited to get this merged and the resulting super fast rebuilds :grinning: