diff --git a/Manifest.toml b/Manifest.toml index baf4657..49f4735 100755 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,144 +1,1057 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.3" +julia_version = "1.12.6" manifest_format = "2.0" -project_hash = "fb16ae23b45a4c23db667056d8a1047b9686893f" +project_hash = "adfe8f37dc71ad4906c6a3381f139d6ebc68809a" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.45" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrowTypes]] +deps = ["Sockets", "UUIDs"] +git-tree-sha1 = "404265cd8128a2515a81d5eae16de90fdef05101" +uuid = "31f734f8-188a-4ce0-8406-c8a06bd891cd" +version = "2.3.0" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BufferedStreams]] +git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643" +uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d" +version = "1.2.2" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" +version = "1.11.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.16" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "REPL", "UUIDs"] +git-tree-sha1 = "cfb7a2e89e245a9d5016b70323db412b3a7438d5" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "3.0.2" + +[[deps.CodecBase]] +deps = ["TranscodingStreams"] +git-tree-sha1 = "40956acdbef3d8c7cc38cba42b56034af8f8581a" +uuid = "6c391c72-fb7b-5838-ba82-7cfb1bcfecbf" +version = "0.3.4" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.CommUtils]] +deps = ["Dates", "Redis", "UUIDs"] +path = "." +uuid = "646cbe82-3d4a-47b2-9440-2e80a472ca20" +version = "0.1.0" + +[[deps.CommonSolve]] +git-tree-sha1 = "eeaad7cef88554c2fa56b5a3f71cfd5cb708c662" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.11" [[deps.Compat]] -deps = ["Dates", "LinearAlgebra", "UUIDs"] -git-tree-sha1 = "61fdd77467a5c3ad071ef8277ac6bd6af7dd4c04" +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.6.0" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.Compiler]] +git-tree-sha1 = "382d79bfe72a406294faca39ef0c3cef6e6ce1f1" +uuid = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1" +version = "0.1.1" [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+0" +version = "1.3.0+1" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.Crayons]] +git-tree-sha1 = "54b76cbb40d9a0f5368c880725b2f141da77c94f" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.2.0" + +[[deps.DBInterface]] +git-tree-sha1 = "a444404b3f94deaa43ca2a58e18153a82695282b" +uuid = "a10d1c49-ce27-4219-8d33-6db1a4562965" +version = "2.6.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "5fab31e2e01e70ad66e3e24c968c264d1cf166d6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.8.2" [[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +deps = ["OrderedCollections"] +git-tree-sha1 = "b0bc6d2cad1fed8b7fd59a1551a991cb3d2809e6" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.13" +version = "0.19.6" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Decimals]] +git-tree-sha1 = "e98abef36d02a0ec385d68cd7dadbce9b28cbd88" +uuid = "abce61dc-4473-55a0-ba07-351d65e31d42" +version = "0.4.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + + [deps.Distances.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.129" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.7.0" + +[[deps.EnumX]] +git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.7" + +[[deps.ExprTools]] +git-tree-sha1 = "d2e49e7efd29719d6f28b891b0e0e159daa9d2b4" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.11" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "5bad39456d9f0166184fce2248783dd9862645c1" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.17.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.Gamma]] +git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e" +uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b" +version = "1.1.0" + +[[deps.GeneralUtils]] +deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "Graphs", "HTTP", "JSON", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "SHA", "StringDistances", "UUIDs"] +git-tree-sha1 = "129b8fa1bf3bf6d8c0a080f39db09b9b986ef8de" +repo-rev = "main" +repo-url = "https://git.yiem.cc/ton/GeneralUtils" +uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe" +version = "0.5.11" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "7eb45fe833a5b7c51cf6d89c5a841d5967e44be3" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.14.0" + + [deps.Graphs.extensions] + GraphsSharedArraysExt = "SharedArrays" + + [deps.Graphs.weakdeps] + Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" + SharedArrays = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "EnumX", "PrecompileTools", "Random", "Reseau", "SHA", "URIs", "UUIDs", "Zlib_jll"] +git-tree-sha1 = "c2c808326222b6dc4bec295a83b55f79aeec98e0" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "2.5.5" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["Gamma", "LinearAlgebra"] +git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.29" + +[[deps.ICU_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b3d8be712fbf9237935bde0ce9b5a736ae38fc34" +uuid = "a51ab1cf-af8e-5615-a023-bc2c838bba6b" +version = "76.2.0+0" + +[[deps.Infinity]] +deps = ["Dates", "Random", "Requires"] +git-tree-sha1 = "cf8234411cbeb98676c173f930951ea29dca3b23" +uuid = "a303e19e-6eb4-11e9-3b09-cd9505f79100" +version = "0.2.4" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.InlineStrings]] +git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.5" +weakdeps = ["ArrowTypes", "Parsers"] + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.Intervals]] +deps = ["ArrowTypes", "Dates", "Printf", "RecipesBase", "Serialization", "TimeZones"] +git-tree-sha1 = "d6fe00b123e32ddd17231b35d69a6394e696fd5a" +uuid = "d8418881-c3e1-53bb-8760-2df7ec849ed5" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.6" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.8.0" + +[[deps.JSON]] +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "c89d196f5ffb64bfbf80985b699ea913b0d2c211" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "1.6.1" +weakdeps = ["ArrowTypes"] + + [deps.JSON.extensions] + JSONArrowExt = ["ArrowTypes"] [[deps.JSON3]] -deps = ["Dates", "Mmap", "Parsers", "SnoopPrecompile", "StructTypes", "UUIDs"] -git-tree-sha1 = "84b10656a41ef564c39d2d477d7236966d2b5683" +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.3" +weakdeps = ["ArrowTypes"] + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "c3d401f110454b4ea24a76be33f6ee0d7d385103" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.11.4" + +[[deps.JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" version = "1.12.0" +[[deps.Kerberos_krb5_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0f2899fdadaab4b8f57db558ba21bdb4fb52f1f0" +uuid = "b39eb1a6-c29a-53d7-8c32-632cd16f18da" +version = "1.21.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayerDicts]] +git-tree-sha1 = "6087ad3521d6278ebe5c27ae55e7bbb15ca312cb" +uuid = "6f188dcb-512c-564b-bc01-e0f76e72f166" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.15.0+0" + +[[deps.LibGit2]] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.9.0+0" + +[[deps.LibPQ]] +deps = ["CEnum", "DBInterface", "Dates", "Decimals", "DocStringExtensions", "FileWatching", "Infinity", "Intervals", "IterTools", "LayerDicts", "LibPQ_jll", "Libdl", "Memento", "OffsetArrays", "SQLStrings", "Tables", "TimeZones", "UTCDateTimes"] +git-tree-sha1 = "3d227cd13cbf1e9a54d7748dab33e078da6f9168" +uuid = "194296ae-ab2e-5f79-8cd4-7183a0a5a0d1" +version = "1.18.0" + +[[deps.LibPQ_jll]] +deps = ["Artifacts", "ICU_jll", "JLLWrappers", "Kerberos_krb5_jll", "Libdl", "OpenSSL_jll", "Zstd_jll"] +git-tree-sha1 = "c692057e05ba6da348bc45d5dab8c7a2c88da518" +uuid = "08be9ffa-1c94-5ee5-a977-46a84ec9b350" +version = "16.14.0+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.3+1" + [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "1.0.1" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoweredCodeUtils]] +deps = ["CodeTracking", "Compiler", "JuliaInterpreter"] +git-tree-sha1 = "1d4c737ab26f51ceed52ab2019c09b7660eb7440" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "3.8.0" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" [[deps.Markdown]] -deps = ["Base64"] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.10" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8" +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.1010+0" + +[[deps.Memento]] +deps = ["Dates", "Distributed", "Requires", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "e03a25cb3b6569623f8246d3d8b3faa7ce86f4ad" +uuid = "f28f55f0-a522-5efc-85c2-fe41dfb9b2d9" +version = "1.5.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" -[[deps.Mosquitto]] -deps = ["Libdl", "Random", "Test"] -path = "/privatejuliapkg/Mosquitto" -uuid = "db317de6-444b-4dfa-9d0e-fbf3d8dd78ea" -version = "0.4.1" +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2025.11.4" + +[[deps.NATS]] +deps = ["Base64", "BufferedStreams", "CodecBase", "Dates", "DocStringExtensions", "JSON3", "MbedTLS", "NanoDates", "Random", "ScopedValues", "Sockets", "Sodium", "StructTypes", "URIs"] +git-tree-sha1 = "a1cdf34ba90ee5cd2658e487d3277ffafee712ce" +uuid = "55e73f9c-eeeb-467f-b4cc-a633fde63d2a" +version = "0.1.1" + +[[deps.NanoDates]] +deps = ["Dates", "Parsers"] +git-tree-sha1 = "850a0557ae5934f6e67ac0dc5ca13d0328422d1f" +uuid = "46f1a544-deae-4307-8689-c12aa3c955c6" +version = "1.0.3" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.3.0" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + + [deps.OffsetArrays.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.21+4" +version = "0.3.29+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.7+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.4+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" [[deps.OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +git-tree-sha1 = "05f45c2e0de6259db764adbfd2f1dc6d3f8de13c" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" +version = "2.0.1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.40" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" [[deps.Parsers]] -deps = ["Dates", "SnoopPrecompile"] -git-tree-sha1 = "6f4fbcd1ad45905a5dee3f4256fabb49aa2110c6" +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.5.7" +version = "2.8.6" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.3.4" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.3.0" +version = "1.5.2" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "7cf039cf79bb41afda7336edf2f3ca2115c44f76" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "3.4.2" + + [deps.PrettyTables.extensions] + PrettyTablesExcelExt = "XLSX" + PrettyTablesTypstryExt = "Typstry" + + [deps.PrettyTables.weakdeps] + Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e" + XLSX = "fdbf4ff8-1666-58a4-91e7-1b58723a45e0" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.4.0" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.3" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" [[deps.Random]] -deps = ["SHA", "Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" [[deps.Redis]] -deps = ["DataStructures", "Dates", "Sockets"] -git-tree-sha1 = "6b3c136222b08ae0c71657f2501c6741782a1ad1" +deps = ["DataStructures", "Dates", "MbedTLS", "Sockets"] +git-tree-sha1 = "11d3ea16cd3d71ad34b2b873f5d8bbf8b258045e" uuid = "0cf705f9-a9e2-50d1-a699-2b372a39b750" -version = "1.0.0" +version = "3.1.0" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Reseau]] +deps = ["NetworkOptions", "OpenSSL_jll", "PrecompileTools", "Random", "SHA"] +git-tree-sha1 = "5ccb99ea21f18b328e5da04a36fd10b56cb8850a" +uuid = "802f3686-a58f-41ce-bb0c-3c43c75bba36" +version = "1.3.2" + +[[deps.Revise]] +deps = ["CRC32c", "CodeTracking", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"] +git-tree-sha1 = "6098400ed73008c45f5f47b35ae114475436ad37" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.16.2" +weakdeps = ["Distributed"] + + [deps.Revise.extensions] + DistributedExt = "Distributed" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.9.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "7fb25a964849d90a0446366cdefca822e0e84900" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "3.0.6" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + RootsUnitfulExt = "Unitful" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" +[[deps.SQLStrings]] +git-tree-sha1 = "55de0530689832b1d3d43491ee6b67bd54d3323c" +uuid = "af517c2e-c243-48fa-aab8-efac3db270f5" +version = "0.1.0" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "67a144433c4ce877ee6d1ada69a124d6b1ecf7be" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.6.2" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "084c47c7c5ce5cfecefa0a98dff69eb3646b5a80" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.10" + [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" -[[deps.SnoopPrecompile]] -deps = ["Preferences"] -git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" -uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" -version = "1.0.3" +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.6" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.Sodium]] +deps = ["Base64", "libsodium_jll"] +git-tree-sha1 = "907703e0d50846f300650d7225bdcab145b7bca9" +uuid = "4f5b5e99-b0ad-42cd-b47a-334e172ec8bd" +version = "1.1.2" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.3" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.8.0" + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + + [deps.SpecialFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.18" + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + + [deps.StaticArrays.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.4" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.8.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.12" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "2.2.0" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.StringDistances]] +deps = ["Distances", "StatsAPI"] +git-tree-sha1 = "cd83a04baf746e3b43b83c61b7de77ab0409b80a" +uuid = "88034a9c-02f8-509d-84a9-84ec65e18404" +version = "1.0.0" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "532e983cd333609f95d618c744fc40d01ea6e17a" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.6" [[deps.StructTypes]] deps = ["Dates", "UUIDs"] -git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" -version = "1.10.0" +version = "1.11.0" + +[[deps.StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "82bee338d650aa515f31866c460cb7e3bcef90b8" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.8.2" + + [deps.StructUtils.extensions] + StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsStaticArraysCoreExt = ["StaticArraysCore"] + StructUtilsTablesExt = ["Tables"] + + [deps.StructUtils.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.8.3+2" [[deps.TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" version = "1.0.3" +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.5.0+2025b" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.13.0" + [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "d422301b2a1e294e3e4214061e44f338cafe18a2" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.22.2" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UTCDateTimes]] +deps = ["Dates", "TimeZones"] +git-tree-sha1 = "4af3552bf0cf4a071bf3d14bd20023ea70f31b62" +uuid = "0f7cfa37-7abf-4834-b969-a8aa512401c2" +version = "1.6.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "0716e01c3b40413de5dedbc9c5c69f27cddfddfc" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.3" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.3.1+2" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+0" +version = "5.15.0+0" + +[[deps.libsodium_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "011b0a7331b41c25524b64dc42afc9683ee89026" +uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8" +version = "1.0.21+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.64.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.7.0+0" diff --git a/Project.toml b/Project.toml index f0e8f00..04aca6b 100755 --- a/Project.toml +++ b/Project.toml @@ -1,11 +1,13 @@ name = "CommUtils" uuid = "646cbe82-3d4a-47b2-9440-2e80a472ca20" -authors = ["naraw "] version = "0.1.0" +authors = ["naraw "] [deps] Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" -JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -Mosquitto = "db317de6-444b-4dfa-9d0e-fbf3d8dd78ea" +GeneralUtils = "c6c72f09-b708-4ac8-ac7c-2084d70108fe" Redis = "0cf705f9-a9e2-50d1-a699-2b372a39b750" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[compat] +GeneralUtils = "0.5.11" diff --git a/src/CommUtils.jl b/src/CommUtils.jl index 1c0790a..911c61f 100755 --- a/src/CommUtils.jl +++ b/src/CommUtils.jl @@ -1,9 +1,5 @@ module CommUtils -# request and respond cannot be exported because Genie confuse -export mqttClient, publish, request, respond, mqttRun - - include("interface.jl") using .interface diff --git a/src/interface.jl b/src/interface.jl index ebace87..4946c45 100755 --- a/src/interface.jl +++ b/src/interface.jl @@ -1,675 +1,5 @@ module interface -export vecToDict, mqttClient, mqttRun, publish, request, respond - -using JSON3, Redis, UUIDs, Dates - -# Mosquitto.jl requires C++ Mosquitto lib (linux only). Ref: https://github.com/denglerchr/Mosquitto.jl -# push!(Base.DL_LOAD_PATH, "/usr", "/usr/local/lib", "/usr/include", "/usr/lib") -using Mosquitto - - -#------------------------------------------------------------------------------------------------100 - -""" Convert received MQTT payload of JSON data to julia dict. - copy() convert JSON3 obj to julia dict -""" -vecToDict(vec::Vector{UInt8}) = copy(JSON3.read(String(vec))) - - -# ---------------------------------------------------------------------------- # -# publish image with julia PythonCall (python 3.9) and opencv # -# ---------------------------------------------------------------------------- # -""" - using Revise - using Images, UUIDs - - # https://pyshine.com/Video-and-bidirectional-text-streaming/ - using CondaPkg; CondaPkg.add_pip("pybase64"); CondaPkg.add_pip("opencv-python"); CondaPkg.add("jsons"); CondaPkg.add("numpy"); - using PythonCall - cv2 = pyimport("cv2") - base64 = pyimport("pybase64") - np = pyimport("numpy") - - using imageUtils - - # ---------------------------------------------------------------------------- # - # client - publish image # - # ---------------------------------------------------------------------------- # - webcam = cv2.VideoCapture(0) - - _, frame_1 = webcam.read() # julia's PythonCall python-obj numpy array - # cv2_bgr_img = cv2.imread("20.jpg") - - # compress image data formats in order to make network transfer easier. - _, buffer = cv2.imencode(".jpg", cv2_bgr_img) - - jpg_as_pyStr = base64.b64encode(buffer).decode("utf-8") - jpg_as_juliaStr = pyconvert(String, jpg_as_pyStr) # for base64, python string or julia string is the same - juliaDict = Dict("img"=> jpg_as_juliaStr) - publish(mqttClient, "sometopic", JSON3.write(juliaDict)) # mqtt publish - - - # ---------------------------------------------------------------------------- # - # server - receive image # - # ---------------------------------------------------------------------------- # - img_str = payload["img"] # payload received thru mqtt - buf = base64.b64decode(img_str) - buffer = np.frombuffer(buf, dtype=np.uint8) - cv2_img = cv2.imdecode(buffer, 1) - julia_array_img = pyconvert(Array, cv2_img); # resulted in julia array but in cv2-numpy's row-major BGR format - img_julia_RGB = np2juliaImage(julia_array_img) - - - # ----------------------------- modify image here ---------------------------- # - - - img_bgr = juliaImg2npImg(img_julia_RGB); - frame_2 = np.array(img_bgr) # julia's PythonCall python-obj numpy array -""" - -# ---------------------------------------------------------------------------- # -# mqtt # -# ---------------------------------------------------------------------------- # -""" - ``` - Store mqtt client info with client instance - ``` - # Example - mqttClientSpec = ( - clientName= "someclient", # name of this client - clientID= mqttclienid, - broker= "192.168.88.10", - pub= (faceAI="face_problem_detection/request",), - ) - client = CommUtils.mqttClient(mqttClientSpec) - - # msg format - msg = Dict{Symbol, Any}( - :msgMeta=> Dict( - :msgPurpose=> "updateStatus", - :from=> "tempCtrl", - :to=> "masterCtrl", - :requestrespond=> "request", # this is a request or respond msg - :sendto=> "", # responder's topic - :replyTo=> nothing, # requester ask responder to send reply to this topic - :repondToMsgId=> ", # responder is responding to this msg id - :taskstatus=> "", # "complete", "fail", "waiting" or other status - :timestamp=> Dates.now(), - :msgId=> uuid4() - ), - :userdata1=> somedata, - :userdata2=> somedata, - ) -""" -Base.@kwdef mutable struct mqttClient - # client info - clientName::String= "" # name of this client - clientID::String= "" - userName::String= "" - password::String= "" # e.g. raw"GP$gxe_2W8vJ-9-5)YU8#-x". use raw"" if $ is present - - # server info - serverName::String= "localmqttserver" - # 172.17.0.1 is docker internal gateway that bind to "0.0.0.0"(linux) or "127.0.0.1"(windows) - broker::String="172.17.0.1" - port::Integer=1883 - - pubtopic::NamedTuple= ( - respondtopic= "", - ) - telemetrytopic::NamedTuple= NamedTuple() # e.g. (temp="temp/telemetry", humid="humid/telemetry) - debugtopic::NamedTuple= NamedTuple() - subtopic::NamedTuple= ( - requesttopic= "", - selfmailboxtopic= "", # use it to receive result from other microservices - ) - - # client operation - clientInstance::Any= nothing # client instance after connected to mqtt server resides here - connectStatus::Bool= false - subStatus::Bool= false - boottime::DateTime= Dates.now() - retainedMsgCleared= false - keepalive::Int= 60 -end -function mqttClient(mqttClientSpec::NamedTuple) - - # instantiate client data struct - s = mqttClient() - - for (k, v) in pairs(mqttClientSpec) - s.:($k) = v - end - - # instantiate mqtt client - if s.clientID != "" - s.clientInstance = Mosquitto.Client(id=s.clientID) - else - s.clientInstance = Mosquitto.Client() - end - - # connect to broker for the 1st time - mqttConnect!(s) - - return s -end - -function mqttConnect!(client::mqttClient) - if client.userName != "" - result = Mosquitto.connect(client.client, client.broker, client.port, - username=client.userName, - password=client.password) - client.connectStatus = result == 0 ? true : false - else - result = Mosquitto.connect(client.clientInstance, client.broker, client.port, keepalive=client.keepalive) - client.connectStatus = result == 0 ? true : false - end -end - -# loop client instance manually -mqttLoop!(client::mqttClient; timeout=100) = loop(client.clientInstance, timeout=timeout) - - -""" - Checking all client for potential connection lost and mark the lost connection -""" -function mqttCheckConnection!(client::mqttClient) - # check channel, if there is something todo - nmessages = Base.n_avail(get_connect_channel()) - - if nmessages == 0 - return 0 - else - for i = 1:nmessages - # each conncb in a channel is a connection struct resulted from Mosquitto.connect() - conncb = take!(get_connect_channel()) - if conncb.clientptr == client.clientInstance.cptr.mosc # use conncb.clientptr (pointer) as identifier - if conncb.val == 1 - println("$(conncb.clientptr): connection successfull") - client.connectStatus = true - elseif conncb.val == 0 - println("$(conncb.clientptr): $(client.clientName) disconnected") - client.connectStatus = false - client.subStatus = false - else - error("undefined condition line $(@__LINE__)") - end - end - end - end -end - - -""" - Reconnect all client that is marked "lost connection" -""" -function mqttReconnect!(client::mqttClient) - if client.connectStatus == false - Mosquitto.disconnect(client.clientInstance) # disconnect to release port before attemping new connection - - if client.userName === nothing # check if the member needs username/password - result = Mosquitto.connect(client.clientInstance, client.broker, client.port, keepalive=client.keepalive) - client.connectStatus = result == 0 ? true : false - else - result = Mosquitto.connect(client.clientInstance, client.broker, client.port, - username=client.userName, - password=client.password) - client.connectStatus = result == 0 ? true : false - end - - end -end - - -""" - Subscribe all topic for all client -""" -function mqttSubOnConnect!(client::mqttClient) - if client.connectStatus == true && client.subStatus == false - for (k, v) in pairs(client.subtopic) - if v != "" - println("sub to $k") - Mosquitto.subscribe(client.clientInstance, v) - client.subStatus = true - end - end - end -end - - -""" - mqtt communication loop, call this function manually -""" -function mqttRun(client::mqttClient, storeResult::Channel) - mqttLoop!(client) - mqttCheckConnection!(client) - mqttReconnect!(client) - mqttSubOnConnect!(client) - mqttOnmessage!(client, storeResult) -end - - -""" - userMsgHandler. A user defined function in user space. - - # Example - - function mqttMsgHander(topic::String, payload) - # this function access workSpace by global variable and do something with msg - end - -""" -function mqttOnmessage!(client::mqttClient, storeResult::Channel) - nmessages = Base.n_avail(get_messages_channel()) - nmessages == 0 && return nothing - - if client.retainedMsgCleared == false - # discard all retained message - for i = 1:nmessages - _ = take!(get_messages_channel()) # discard new arrival package - end - client.retainedMsgCleared = true - println("retained mqtt messages cleared") - elseif client.retainedMsgCleared - for i = 1:nmessages - pkg = take!(get_messages_channel()) # take new arrival package - # sptoptic = split(topic, "/") - payload = vecToDict(pkg.payload) # payload in Dict format - put!(storeResult, (topic=pkg.topic, payload=payload)) - end - else - error("undefined condition") - end -end - - - -function publish(client::mqttClient, msg::Dict, pubtopic::String="") - Mosquitto.publish(client.clientInstance, pubtopic, JSON3.write(msg)) -end - - -""" - request function check msg for additional communication info in addition to publish() -""" -function request(client::mqttClient, msg::Dict; pubtopic::String="") - pubto = Vector{String}() - if pubtopic != "" - push!(pubto, pubtopic) - elseif msg[:msgMeta][:sendto] != "" - push!(pubto, msg[:msgMeta][:sendto]) - else - if length(client.pubtopic) != 0 - for (k, topic) in pairs(client.pubtopic) - push!(pubto, topic) - end - else - error("publish topic not defined") - end - end - - - for i in pubto - Mosquitto.publish(client.clientInstance, i, JSON3.write(msg)) - end -end - -""" - respond function check msg for additional communication info in addition to publish() -""" -function respond(client::mqttClient, respond_msg::Dict, request_msg::Dict; pubtopic::String="") - replyTo = request_msg[:msgMeta][:replyTo] - respond_msg[:msgMeta][:repondToMsgId] = request_msg[:msgMeta][:msgId] - respond_msg[:msgMeta][:requestrespond] = "respond" - - pubto = Vector{String}() - if pubtopic != "" - push!(pubto, pubtopic) - elseif replyTo != "" - push!(pubto, replyTo) - else - if length(client.pubtopic) != 0 - for (k, topic) in pairs(client.pubtopic) - push!(pubto, topic) - end - else - error("publish topic not defined") - end - end - - for i in pubto - Mosquitto.publish(client.clientInstance, i, JSON3.write(respond_msg)) - end -end - - -""" - Example of mqtt_member_dict which store details about mqtt and connected-Client -""" -mqtt_member_dict = Dict( - :firstClient=> Dict( # masterController itself for internal communication - :clientName=> "masterController", # name of this client - :clientID=> "09f165cf-df9e-4607-bb34-a3c9f0a6bb98", - :username=> nothing, - :password=> nothing, - - # mqtt container is located outside of greenhouse-network1, - # 172.17.0.1 is local docker IP - :serverName=> "local_mqtt_server", # name of the server this client is connecting - :broker=> "172.17.0.1", - :port=> 1883, - :requesttopic=> "09f165cf-df9e-4607-bb34-a3c9f0a6bb98/request", # channel of THIS client - :respondtopic=> "09f165cf-df9e-4607-bb34-a3c9f0a6bb98/respond", # channel of THIS client - :telemetrytopic=> "09f165cf-df9e-4607-bb34-a3c9f0a6bb98/telemetry", # channel of THIS client - :debugtopic=> "09f165cf-df9e-4607-bb34-a3c9f0a6bb98/debug", # channel of THIS client - :pubtoptic=> Vector{String}(), # other channel this client publish to - :subtoptic=> Vector{String}(), # other channel this client subscribe to - :mqttClient=> nothing, # client instance after connected to mqtt server resides here - :connectStatus=> false, - :subStatus=> false - ), - :secondClient=> Dict( # masterController itself for internal communication - :clientName=> "masterController", # name of this client - :clientID=> "42f53073-b2ed-4b4a-8b11-155c58135dfc", - :username=> nothing, - :password=> nothing, - - # mqtt container is located outside of greenhouse-network1, - # 172.17.0.1 is local docker IP - :serverName=> "yiemMaintenance", # name of the server this client is connecting - :broker=> "mqtt.yiem.ai", - :port=> 1883, - :requesttopic=> "42f53073-b2ed-4b4a-8b11-155c58135dfc/request", # channel of THIS client - :respondtopic=> "42f53073-b2ed-4b4a-8b11-155c58135dfc/respond", # channel of THIS client - :telemetrytopic=> "42f53073-b2ed-4b4a-8b11-155c58135dfc/telemetry", # channel of THIS client - :debugtopic=> "42f53073-b2ed-4b4a-8b11-155c58135dfc/debug", # channel of THIS client - :pubtoptic=> Vector{String}(), # other channel this client publish to - :subtoptic=> Vector{String}(), # other channel this client subscribe to - :mqttClient=> nothing, # client instance after connected to mqtt server resides here - :connectStatus=> false, - :subStatus=> false - ), - :thirdClient=> Dict( # masterController itself for internal communication - :clientName=> "masterController", # name of this client - :clientID=> "f64e864b-e93f-4d1e-8662-0d6da68c9c03", #TODO change here netpie clientID - :username=> "t5gBa", #TODO change here netpie token - :password=> raw"GP$gxe_2W8vJ-9-5)YU8#-x", #TODO change here netpie secret - - # mqtt container is located outside of greenhouse-network1, - # 172.17.0.1 is local docker IP - :serverName=> "netpie2020", # name of the server this client is connecting - :broker=> "broker.netpie.io", - :port=> 1883, - :requesttopic=> "@msg/masterController", # channel of THIS client - :respondtopic=> "@shadow/data/update", # channel of THIS client # channel of THIS client - :pubtoptic=> Vector{String}(), # other channel this client publish to - :subtoptic=> Vector{String}(), # other channel this client subscribe to - :mqttClient=> nothing, # client instance after connected to mqtt server resides here - :connectStatus=> false, - :subStatus=> false - ), -) - - -""" operate on mqtt_member_dict - Connect all clients to relevent server -""" -function mqttConnect!(mqttMemberDict::Dict) - for (k, v) in mqttMemberDict - member = mqttMemberDict[k] - member[:mqttClient] = member[:clientID] === nothing ? Mosquitto.Client() : - Mosquitto.Client(id=member[:clientID]) - println("connecting member $k") - port = haskey(member, :port) ? member[:port] : 1883 - if member[:username] === nothing - result = Mosquitto.connect(member[:mqttClient], member[:broker], port) - member[:connectStatus] = result == 0 ? true : false - else - result = Mosquitto.connect(member[:mqttClient], member[:broker], port, - username=member[:username], - password=member[:password]) - member[:connectStatus] = result == 0 ? true : false - end - end -end - - -""" operate on mqtt_member_dict - Checking all client for potential connection lost and mark the lost connection -""" -function mqttCheckConnection!(mqttMemberDict::Dict) - # check channel, if there is something todo - nmessages = Base.n_avail(get_connect_channel()) - - if nmessages == 0 - return 0 - else - for i = 1:nmessages - # each conncb in a channel is a connection struct resulted from Mosquitto.connect() - conncb = take!(get_connect_channel()) - for (k, v) in mqttMemberDict - member = mqttMemberDict[k] - if conncb.clientptr == member[:mqttClient].cptr.mosc # use conncb.clientptr (pointer) as identifier - if conncb.val == 1 - println("$(conncb.clientptr): connection successfull") - member[:connectStatus] = true - elseif conncb.val == 0 - println("$(conncb.clientptr): member $i disconnected") - member[:connectStatus] = false - member[:subStatus] = false - else - error("something wrong with connection message") - end - end - end - end - end -end - - -""" operate on mqtt_member_dict - Reconnect all client that is marked "lost connection" -""" -function mqttReconnect!(mqttMemberDict::Dict) - for (k, v) in mqttMemberDict # find the disconnected member - member = mqttMemberDict[k] - if member[:connectStatus] == false - Mosquitto.disconnect(member[:mqttClient]) # disconnect to release port before attemping new connection - - port = haskey(member, :port) ? member[:port] : 1883 - if member[:username] === nothing # check if the member needs username/password - result = Mosquitto.connect(member[:mqttClient], member[:broker], port) - member[:connectStatus] = result == 0 ? true : false - else - result = Mosquitto.connect(member[:mqttClient], member[:broker], port, - username=member[:username], - password=member[:password]) - member[:connectStatus] = result == 0 ? true : false - end - - end - end -end - - -""" operate on mqtt_member_dict - Subscribe all topic for all client -""" -function mqttSubOnConnect!(mqttMemberDict::Dict, subChannel::Vector{String}) - for (k, v) in mqttMemberDict - member = mqttMemberDict[k] - #TODO once reconnect, publish current machine state to netpie - if member[:connectStatus] == true && member[:subStatus] == false - Mosquitto.subscribe(member[:mqttClient], member[:requesttopic]) # sub to its own channel - - # mastercontroller sub to other controller - if k == :firstClient - Mosquitto.subscribe(member[:mqttClient], "$(config[:farminfo][:farmId])/controller/+/telemetry") - Mosquitto.subscribe(member[:mqttClient], "$(config[:farminfo][:farmId])/controller/+/respond") - end - member[:subStatus] = true - end - end -end - - -""" operate on mqtt_member_dict -""" -# What to do if there is a message -function mqttOnmessage!(mqttMemberDict::Dict, netpieCommDict::Dict, workDict::Dict) - nmessages = Base.n_avail(get_messages_channel()) - nmessages == 0 && return 0 - - if workDict[:residueMsgClearedStartTime] === nothing - workDict[:residueMsgClearedStartTime] = Dates.now() - end - timepass = (Dates.now() - workDict[:residueMsgClearedStartTime]).value / 1000.0 - - if timepass <= 10 && workDict[:residueMsgCleared] == 0 - # discard all residue message - for i = 1:nmessages - _ = take!(get_messages_channel()) # take new arrival package - end - elseif timepass > 10 && workDict[:residueMsgCleared] == 0 - workDict[:residueMsgCleared] = 1 - println("residue mqtt messages cleared") - else - for i = 1:nmessages - pkg = take!(get_messages_channel()) # take new arrival package - topic = pkg.topic - sptoptic = split(topic, "/") - payload = vecToDict(pkg.payload) - # println("topic ", topic) - # println("payload ", payload) - # Do something with the message - if topic == mqttMemberDict[:firstClient][:requesttopic] - # publish(c2, "julia", "From member 2"; qos = 2) - # result = yiemHandler() - return 0 - #FIXME add yiem.ai in config.json file - # elseif topic == mqttMemberDict[:yiemMaintenance][:requesttopic] - # localHandler(payload, workDict) - elseif topic == mqttMemberDict[:netpieGreenhouseActive][:requesttopic] # command from NETPIE - println("NETPIE msg") - netpieMsgHandler(payload, netpieCommDict, workDict, mqttMemberDict[:netpieGreenhouseActive]) - - elseif sptoptic[2] == "controller" - controllerName = sptoptic[3] - if controllerName == "fertilizerController_1" - fertilizerController_msgHandler(sptoptic[end], payload, workDict) - elseif controllerName == "temperatureController_1" - temperatureController_msgHandler(sptoptic[end], payload, workDict) - elseif controllerName == "humidityController_1" - humidityController_msgHandler(sptoptic[end], payload, workDict) - elseif controllerName == "illuminanceController_1" - illuminanceController_msgHandler(sptoptic[end], payload, workDict) - elseif controllerName == "co2Controller_1" - co2Controller_msgHandler(sptoptic[end], payload, workDict) - elseif controllerName == "ventilationController_1" - ventilationController_msgHandler(sptoptic[end], payload, workDict) - else - error("undefined condition") - end - else - println("Not yet define what to do with message from this topic: $topic") - return 1 - end - - return 0 - end - end -end - - -""" operate on mqtt_member_dict - network run -""" -function mqttLoop!(mqttMemberDict::Dict; timeout=100) - for (k, v) in mqttMemberDict - member = mqttMemberDict[k] - loop(member[:mqttClient], timeout=timeout) - end -end - -""" operate on mqtt_member_dict -""" -function mqttDisconnect!(memberList) - for member in memberList - disconnect(member[:mqttClient]) - end -end - - -""" - publish msg with msgMeta information. - - sourceName = "fertilizerController_1" or could be any name - destinationName = "masterController" or could be any name - topic = :requesttopic, :respondtopic, :telemetrytopic will use its own topic - or - "masterController/request" will use specified topic -""" -function publishMsg(destinationName::String, msgPurpose::String, topic::Symbol, - variableNameAndValue::Dict, workDict::Dict, config::Dict; - sourceName=workDict[:mainCtrlName]) - - msg = Dict{Symbol, Any}( - :msgMeta=> Dict( - :msgPurpose=> msgPurpose, # "updateStatus", "fertilizerMixOrder" - :from=> sourceName, - :to=> destinationName, - :repondToMsgId=> nothing, # the msg this msg is responding to - :repondtopic=> nothing, # ask server to reply to this topic - :timestamp=> Dates.now(), - :msgId=> uuid4()), - :payload=> nothing, - ) - for (k, v) in variableNameAndValue - msg[k] = v - end - - pubtopic = config[workDict[:mainCtrlName]][:mqttMembers][:firstClient][topic] - publish(config[workDict[:mainCtrlName]][:mqttMembers][:firstClient][:mqttClient], - pubtopic, JSON3.write(msg)) -end - -function publishMsg(destinationName::String, msgPurpose::String, topic::String, - variableNameAndValue::Dict, workDict::Dict, config::Dict; - sourceName=workDict[:mainCtrlName]) - - msg = Dict{Symbol, Any}( - :msgMeta=> Dict( - :msgPurpose=> msgPurpose, # "updateStatus", "fertilizerMixOrder" - :from=> sourceName, - :to=> destinationName, - :repondToMsgId=> nothing, # the msg this msg is responding to - :repondtopic=> nothing, # ask server to reply to this topic - :timestamp=> Dates.now(), - :msgId=> uuid4()), - :payload=> nothing, - ) - for (k, v) in variableNameAndValue - msg[k] = v - end - - pubtopic = topic - publish(config[workDict[:mainCtrlName]][:mqttMembers][:firstClient][:mqttClient], - pubtopic, JSON3.write(msg)) -end - - - - - - - - - - - - -