Skip to content

Instantly share code, notes, and snippets.

View ramonsmits's full-sized avatar

Ramon Smits ramonsmits

View GitHub Profile
@ramonsmits
ramonsmits / emoji.md
Last active December 9, 2022 08:22
Emoji

🐛 ✨ 📦 🚨 ✔️❌ ✅❎ ⚙️ 🔧 🚨 📚

@ramonsmits
ramonsmits / water-meter.yml
Created October 4, 2022 11:46
ESPHome ESP32 water meter
# originally based on https://www.huizebruin.nl/home-assistant/esphome/watermeter-uitlezen-in-home-assistant-met-esphome
#
# Differences:
# - Uses MQTT.
# - Uses internal_filter: 250ms to skip short pulses due to "floating pin"
# voltage. Measure your minimum pulse time by opening several taps in your
# home and count the number of pulse in 30 seconds and you can calculate the
# minimum pulse duration. If you set this value just under this you should be
# safe.
# - Blinks the blue LED (GPIO2) for every received pulse.
@ramonsmits
ramonsmits / XDocumentPreserve.cs
Created September 2, 2022 11:15
XDocument read/write that preserves BOM, line ending and whitespace
//
// Preserves:
//
// - Whitespace (`LoadOptions.PreserveWhitespace`)
// - BOM (passing `UTF8Encoding(false)` ensures reader.Encoding will use this encoding, if BOM is present reader will swap to UTF8Encoding(true))
// - Line endings (using StreamReader instead of passing filename preserves line endings in document)
// - XML declaration header
//
var path = ""; // Path to XML file
@ramonsmits
ramonsmits / NaturalComparer.cs
Created August 30, 2022 08:46
NaturalComparer to compare string with numerics
//
// Based on https://stackoverflow.com/a/5641272/199551
//
public class NaturalComparer : IComparer<string>
{
public static readonly NaturalComparer Instance = new NaturalComparer();
private NaturalComparer() { }
public int Compare(string x, string y)
@ramonsmits
ramonsmits / CheckSizeBehavior.cs
Created June 16, 2022 15:59
NServiceBus 7 - Behavior that validates if the serialized body does not exceed a configurable limit
//
// Usage:
//
// var endpointConfiguration = new EndpointConfiguration("MyEndpoint")
// ...
// endpointConfiguration.Pipeline.Register(new CheckSizeBehavior(CheckSizeBehavior.StandardTierMaxSize), nameof(CheckSizeBehavior));
//
using NServiceBus.Pipeline;
class CheckSizeBehavior : IBehavior<IOutgoingPhysicalMessageContext, IOutgoingPhysicalMessageContext>
@ramonsmits
ramonsmits / ValidateDestinationExistsBehavior.cs
Last active June 15, 2022 14:14
NServiceBus 7 - Validate if the Azure Service Bus unicast destination exists
// Usage:
//
// var endpointConfiguration = new EndpointConfiguration("MyEndpoint")
// ...
// var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString");
// var managementClient = new ManagementClient(connectionString);
// endpointConfiguration.Pipeline.Register(new ValidateDestinationExistsBehavior (managementClient), nameof(ValidateDestinationExistsBehavior));
//
using Microsoft.Azure.ServiceBus.Management;
using NServiceBus.Pipeline;
@ramonsmits
ramonsmits / ExceptionEnricher.cs
Created April 30, 2022 12:47
SeriLog log event enricher that adds exception type, message, data, and md5 of ToString()
using System;
using System.Collections;
using System.Linq;
using Serilog.Core;
using Serilog.Events;
class ExceptionEnricher : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
@ramonsmits
ramonsmits / DsmrReaderTeslaMateLoadBalancer.cs
Last active January 16, 2023 11:54
Tesla charging load balancer based on events from DSMR Reader and TeslaMate
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using MQTTnet;
class DsmrTeslaLoadBalancer
@ramonsmits
ramonsmits / TransactionManagerHelper.cs
Last active April 7, 2022 06:42
Override the TransactionManager.MaximumTimeout via reflection
static class TransactionManagerHelper
{
public static void ConfigureTransactionTimeout(TimeSpan timeout)
{
#if NETFRAMEWORK
SetTransactionManagerField("_cachedMaxTimeout", true);
SetTransactionManagerField("_maximumTimeout", timeout);
#else
SetTransactionManagerField("s_cachedMaxTimeout", true);
SetTransactionManagerField("s_maximumTimeout", timeout);
@ramonsmits
ramonsmits / Shuffle.cs
Created April 7, 2022 06:38
Fisher–Yates shuffle on list items
static class ListExtensions
{
static Random rng = new Random();
public static void Shuffle<T>(this IList<T> list)
{
// From https://stackoverflow.com/a/1262619/199551 but refactored via Resharper
int n = list.Count;
while (n > 1)
{